#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
#define N 100010
using namespace std;
int n,tt,le;
char a[N][];
int m[N],X[N];
struct node
{
int l,r,w;
} q[*N];
void pushup(int rt)
{
q[rt].w=q[rt<<].w+q[rt<<|].w;
}
void build(int l,int r,int rt)
{
q[rt].l=l;
q[rt].r=r;
q[rt].w=;
if(l==r) return ;
int mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
}
void update(int l,int r,int rt,int key)
{
if(l==r&&r==key)
{
q[rt].w=;
return ;
}
int mid=(l+r)>>;
if(key<=mid) update(l,mid,rt<<,key);
else update(mid+,r,rt<<|,key);
pushup(rt);
return ;
}
int query(int l,int r,int rt,int key)
{
if(l==r)
{
return l;
}
int mid=(l+r)>>;
if(key<=q[rt<<].w) return query(l,mid,rt<<,key);
else return query(mid+,r,rt<<|,key-q[rt<<].w);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
tt=;
for(int i=; i<n; i++)
{
scanf("%s%d",a[i],&m[i]);
if(a[i][]=='P')
{
X[tt++]=m[i];
}
}
sort(X,X+tt);
int sum=unique(X,X+tt)-X;
build(,sum,);
for(int i=; i<n; i++)
{
if(a[i][]=='P')
{
le=lower_bound(X,X+sum,m[i])-X+;
update(,sum,,le);
}
else if(a[i][]=='Q')
{
if(q[].w<m[i])
{
printf("-1\n");
}
else
{
int tt=query(,sum,,m[i]);
printf("%d\n",X[tt-]);
}
}
}
}
return ;
}
05-11 20:01