use constant U => ....;
sub init {@A = (0) x U}
sub insert {$A [shift] = 1}
sub delete {$A [shift] = 0}
sub query {$A [shift]}
sub clear {@A = (0) x U}
####
A B
+------+ +------+
U-1 | ? | | ? |
+------+ +------+
. . . .
. . . .
. . . .
. . . .
. . . .
+------+ +------+
4 | 0 | | 3 |
+------+ +------+
3 | 4 | | 1 | <---- C (== 3)
+------+ +------+
2 | 1 | | 1 |
+------+ +------+
1 | 2 | | 2 |
+------+ +------+
0 | 2 | | 4 |
+------+ +------+
####
int query (int i) {0 <= A [i] && A [i] < C && B [A [i]] == i}
void insert (int i) {if (!query (i)) {B [C] = i; A [i] = C; C ++}}
void delete (int i) {if (query (i)) {
B [A [ i]] = B [C - 1];
A [B [ C - 1]] = A [i];
C --}}