#include <bits/stdc++.h>
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;i++)
#define DOW(i,a,b) for (int i=(a),_b=(b);i>=_b;i--)
#define probability 0.5
#define maxlevel 19
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
typedef unsigned long long ULL;
struct node{
node *left, *right, *down;
int val, len;
} *head[maxlevel+1], *path[maxlevel+1], *nil;
const int oo = 2e9;
int curmaxh, listlen;
int indexdist[maxlevel+1];
void init(){
nil = new node;
nil->val = oo;
nil->len = 0;
FOR(i,1,maxlevel){
head[i] = new node;
if (i != 1)
head[i]->down = head[i-1];
else head[i]->down = NULL;
head[i]->left = nil;
head[i]->val = -oo;
head[i]->len = 0;
}
FOR(i,1,maxlevel) path[i] = new node;
memset(path, 0, sizeof(node*) * (maxlevel+1));
curmaxh = 1;
}
node *search(int value){
node *curpos = head[curmaxh];
int curh = curmaxh;
indexdist[0] = 0;
while (1){
indexdist[curh] = 0;
while (curpos->left->val <= value){
indexdist[curh] += curpos->len;
curpos = curpos->left;
}
indexdist[0] += indexdist[curh];
path[curh] = curpos;
curh--;
if (curpos->down != NULL)
curpos = curpos->down;
else break;
}
return curpos;
}
node *searchindex(int idx){
int curidx = idx;
node *curpos = head[curmaxh];
while (true){
while (curpos->left != nil && curidx >= curpos->len){
curidx -= curpos->len;
curpos = curpos->left;
}
if (curpos->down != NULL)
curpos = curpos->down;
else break;
}
if (curidx > 0) curpos = NULL;
return curpos;
}
void remove(int value){
if (search(value)->val != value) return;
listlen--;
bool curstate = 1;
FOR(i,1,curmaxh){
curstate = curstate && (path[i]->down == path[i-1]);
if (curstate){
if (path[i]->right != NULL)
path[i]->right->left = path[i]->left;
if (path[i]->left != NULL)
path[i]->left->right = path[i]->right;
if (path[i]->right != NULL)
path[i]->right->len = path[i]->right->len + path[i]->len - 1;
}
else path[i]->len--;
}
}
int getlevel(){
int level = 1;
while ((float)rand() / RAND_MAX < probability && level < maxlevel)
level++;
return level;
}
node *insertnode(node *insertpoint, node *child, int x, int value){
node *newnode = new node;
newnode->val = value;
newnode->len = insertpoint->len - x;
newnode->down = child;
newnode->left = insertpoint->left;
newnode->right = insertpoint;
newnode->left->right = newnode;
insertpoint->len = x + 1;
insertpoint->left = newnode;
return newnode;
}
void insert(int value){
if (search(value)->val == value) return;
listlen++;
node *curpos = NULL;
srand(time(NULL));
int newlevel = getlevel();
indexdist[0] = 0;
FOR(i,1,newlevel){
if (i <= curmaxh)
curpos = insertnode(path[i], curpos, indexdist[i-1], value);
else{
head[i]->len = listlen;
curpos = insertnode(head[i], curpos, indexdist[i-1], value);
}
indexdist[i] += indexdist[i-1];
}
FOR(i,newlevel+1,curmaxh)
path[i]->len++;
curmaxh = max(curmaxh, newlevel);
}
int main(){
//freopen("input.inp","r",stdin);
//freopen("output.out","w",stdout);
init();
int q;
scanf("%d\n",&q);
while (q--){
char req; int x;
scanf("%c%d\n",&req,&x);
if (req == 'I') insert(x);
if (req == 'D') remove(x);
if (req == 'K'){
node *tmp = searchindex(x);
if (tmp == NULL)
printf("invalid\n");
else printf("%d\n",tmp->val);
}
if (req == 'C'){
search(x-1);
printf("%d\n",indexdist[0]);
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKI2RlZmluZSBGT1IoaSxhLGIpIGZvciAoaW50IGk9KGEpLF9iPShiKTtpPD1fYjtpKyspCiNkZWZpbmUgRE9XKGksYSxiKSBmb3IgKGludCBpPShhKSxfYj0oYik7aT49X2I7aS0tKQojZGVmaW5lIHByb2JhYmlsaXR5IDAuNQojZGVmaW5lIG1heGxldmVsIDE5CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAp0eXBlZGVmIHBhaXI8aW50LGludD4gUElJOwp0eXBlZGVmIGxvbmcgbG9uZyBMTDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUxMOwogCnN0cnVjdCBub2RlewoJbm9kZSAqbGVmdCwgKnJpZ2h0LCAqZG93bjsKCWludCB2YWwsIGxlbjsKfSAqaGVhZFttYXhsZXZlbCsxXSwgKnBhdGhbbWF4bGV2ZWwrMV0sICpuaWw7CiAKY29uc3QgaW50IG9vID0gMmU5OwogCmludCBjdXJtYXhoLCBsaXN0bGVuOwppbnQgaW5kZXhkaXN0W21heGxldmVsKzFdOwogCnZvaWQgaW5pdCgpewoJbmlsID0gbmV3IG5vZGU7CgluaWwtPnZhbCA9IG9vOwoJbmlsLT5sZW4gPSAwOwoJCglGT1IoaSwxLG1heGxldmVsKXsKCQloZWFkW2ldID0gbmV3IG5vZGU7CgkJaWYgKGkgIT0gMSkKCQkJaGVhZFtpXS0+ZG93biA9IGhlYWRbaS0xXTsKCQllbHNlIGhlYWRbaV0tPmRvd24gPSBOVUxMOwoJCWhlYWRbaV0tPmxlZnQgPSBuaWw7CgkJaGVhZFtpXS0+dmFsID0gLW9vOwoJCWhlYWRbaV0tPmxlbiA9IDA7Cgl9CgkKCUZPUihpLDEsbWF4bGV2ZWwpIHBhdGhbaV0gPSBuZXcgbm9kZTsKCW1lbXNldChwYXRoLCAwLCBzaXplb2Yobm9kZSopICogKG1heGxldmVsKzEpKTsKCWN1cm1heGggPSAxOwp9CiAKbm9kZSAqc2VhcmNoKGludCB2YWx1ZSl7Cglub2RlICpjdXJwb3MgPSBoZWFkW2N1cm1heGhdOwoJaW50IGN1cmggPSBjdXJtYXhoOwoJaW5kZXhkaXN0WzBdID0gMDsKCQoJd2hpbGUgKDEpewoJCWluZGV4ZGlzdFtjdXJoXSA9IDA7CgkJd2hpbGUgKGN1cnBvcy0+bGVmdC0+dmFsIDw9IHZhbHVlKXsKCQkJaW5kZXhkaXN0W2N1cmhdICs9IGN1cnBvcy0+bGVuOwoJCQljdXJwb3MgPSBjdXJwb3MtPmxlZnQ7CgkJfQoJCQoJCWluZGV4ZGlzdFswXSArPSBpbmRleGRpc3RbY3VyaF07CgkJcGF0aFtjdXJoXSA9IGN1cnBvczsKCQljdXJoLS07CgkJCgkJaWYgKGN1cnBvcy0+ZG93biAhPSBOVUxMKQoJCQljdXJwb3MgPSBjdXJwb3MtPmRvd247CgkJZWxzZSBicmVhazsKCX0KCQoJcmV0dXJuIGN1cnBvczsKfQogCm5vZGUgKnNlYXJjaGluZGV4KGludCBpZHgpewoJaW50IGN1cmlkeCA9IGlkeDsKCW5vZGUgKmN1cnBvcyA9IGhlYWRbY3VybWF4aF07CgkKCXdoaWxlICh0cnVlKXsKCQl3aGlsZSAoY3VycG9zLT5sZWZ0ICE9IG5pbCAmJiBjdXJpZHggPj0gY3VycG9zLT5sZW4pewoJCQljdXJpZHggLT0gY3VycG9zLT5sZW47CgkJCWN1cnBvcyA9IGN1cnBvcy0+bGVmdDsKCQl9CgkJCgkJaWYgKGN1cnBvcy0+ZG93biAhPSBOVUxMKQoJCQljdXJwb3MgPSBjdXJwb3MtPmRvd247CgkJZWxzZSBicmVhazsKCX0KCQoJaWYgKGN1cmlkeCA+IDApIGN1cnBvcyA9IE5VTEw7CglyZXR1cm4gY3VycG9zOwp9CiAKdm9pZCByZW1vdmUoaW50IHZhbHVlKXsKCWlmIChzZWFyY2godmFsdWUpLT52YWwgIT0gdmFsdWUpIHJldHVybjsKCWxpc3RsZW4tLTsKCQoJYm9vbCBjdXJzdGF0ZSA9IDE7CgkKCUZPUihpLDEsY3VybWF4aCl7CgkJY3Vyc3RhdGUgPSBjdXJzdGF0ZSAmJiAocGF0aFtpXS0+ZG93biA9PSBwYXRoW2ktMV0pOwoJCWlmIChjdXJzdGF0ZSl7CgkJCWlmIChwYXRoW2ldLT5yaWdodCAhPSBOVUxMKQoJCQkJcGF0aFtpXS0+cmlnaHQtPmxlZnQgPSBwYXRoW2ldLT5sZWZ0OwoJCQlpZiAocGF0aFtpXS0+bGVmdCAhPSBOVUxMKQoJCQkJcGF0aFtpXS0+bGVmdC0+cmlnaHQgPSBwYXRoW2ldLT5yaWdodDsKCQkJCQoJCQlpZiAocGF0aFtpXS0+cmlnaHQgIT0gTlVMTCkKCQkJCXBhdGhbaV0tPnJpZ2h0LT5sZW4gPSBwYXRoW2ldLT5yaWdodC0+bGVuICsgcGF0aFtpXS0+bGVuIC0gMTsKCQl9CgkJZWxzZSBwYXRoW2ldLT5sZW4tLTsKCX0KfQogCmludCBnZXRsZXZlbCgpewoJaW50IGxldmVsID0gMTsKCXdoaWxlICgoZmxvYXQpcmFuZCgpIC8gUkFORF9NQVggPCBwcm9iYWJpbGl0eSAmJiBsZXZlbCA8IG1heGxldmVsKQoJCWxldmVsKys7CglyZXR1cm4gbGV2ZWw7Cn0KIApub2RlICppbnNlcnRub2RlKG5vZGUgKmluc2VydHBvaW50LCBub2RlICpjaGlsZCwgaW50IHgsIGludCB2YWx1ZSl7Cglub2RlICpuZXdub2RlID0gbmV3IG5vZGU7CgluZXdub2RlLT52YWwgPSB2YWx1ZTsKCW5ld25vZGUtPmxlbiA9IGluc2VydHBvaW50LT5sZW4gLSB4OwoJbmV3bm9kZS0+ZG93biA9IGNoaWxkOwoJbmV3bm9kZS0+bGVmdCA9IGluc2VydHBvaW50LT5sZWZ0OwoJbmV3bm9kZS0+cmlnaHQgPSBpbnNlcnRwb2ludDsKCW5ld25vZGUtPmxlZnQtPnJpZ2h0ID0gbmV3bm9kZTsKCQoJaW5zZXJ0cG9pbnQtPmxlbiA9IHggKyAxOwoJaW5zZXJ0cG9pbnQtPmxlZnQgPSBuZXdub2RlOwoJCglyZXR1cm4gbmV3bm9kZTsKfQogCnZvaWQgaW5zZXJ0KGludCB2YWx1ZSl7CglpZiAoc2VhcmNoKHZhbHVlKS0+dmFsID09IHZhbHVlKSByZXR1cm47CglsaXN0bGVuKys7CgkKCW5vZGUgKmN1cnBvcyA9IE5VTEw7CglzcmFuZCh0aW1lKE5VTEwpKTsKCWludCBuZXdsZXZlbCA9IGdldGxldmVsKCk7CglpbmRleGRpc3RbMF0gPSAwOwoJRk9SKGksMSxuZXdsZXZlbCl7CgkJaWYgKGkgPD0gY3VybWF4aCkKCQkJY3VycG9zID0gaW5zZXJ0bm9kZShwYXRoW2ldLCBjdXJwb3MsIGluZGV4ZGlzdFtpLTFdLCB2YWx1ZSk7CgkJZWxzZXsKCQkJaGVhZFtpXS0+bGVuID0gbGlzdGxlbjsKCQkJY3VycG9zID0gaW5zZXJ0bm9kZShoZWFkW2ldLCBjdXJwb3MsIGluZGV4ZGlzdFtpLTFdLCB2YWx1ZSk7CgkJfQoJCQoJCWluZGV4ZGlzdFtpXSArPSBpbmRleGRpc3RbaS0xXTsKCX0KCQoJRk9SKGksbmV3bGV2ZWwrMSxjdXJtYXhoKQoJCXBhdGhbaV0tPmxlbisrOwoJCgljdXJtYXhoID0gbWF4KGN1cm1heGgsIG5ld2xldmVsKTsKfQogCmludCBtYWluKCl7CgkvL2ZyZW9wZW4oImlucHV0LmlucCIsInIiLHN0ZGluKTsKCS8vZnJlb3Blbigib3V0cHV0Lm91dCIsInciLHN0ZG91dCk7Cglpbml0KCk7CgkKCWludCBxOwoJc2NhbmYoIiVkXG4iLCZxKTsKCXdoaWxlIChxLS0pewoJCWNoYXIgcmVxOyAgIGludCB4OwoJCXNjYW5mKCIlYyVkXG4iLCZyZXEsJngpOwoJCQoJCWlmIChyZXEgPT0gJ0knKSBpbnNlcnQoeCk7CgkJaWYgKHJlcSA9PSAnRCcpIHJlbW92ZSh4KTsKCQlpZiAocmVxID09ICdLJyl7CgkJCW5vZGUgKnRtcCA9IHNlYXJjaGluZGV4KHgpOwoJCQlpZiAodG1wID09IE5VTEwpCgkJCQlwcmludGYoImludmFsaWRcbiIpOwoJCQllbHNlIHByaW50ZigiJWRcbiIsdG1wLT52YWwpOwoJCX0KCQlpZiAocmVxID09ICdDJyl7CgkJCXNlYXJjaCh4LTEpOwoJCQlwcmludGYoIiVkXG4iLGluZGV4ZGlzdFswXSk7CgkJfQoJfQoJcmV0dXJuIDA7Cn0g