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 --}}