//Pranet Verma
#include <bits/stdc++.h>
using namespace std;
typedef struct Node* pnode;
struct Node
{
    pnode l,r;
    int prior,cnt,val,mx;
}tree[100005],*pool=tree,*null=tree;
pnode init(int v)
{
    ++pool;
    pool->prior=rand();
    pool->val=v;
    pool->l=null;
    pool->r=null;
    pool->cnt=0;
    pool->mx=v;
    return pool;
}
void update(pnode u)
{
    if(u!=null)
    {
        u->cnt=1+u->l->cnt+u->r->cnt;
        u->mx=max(u->val,max(u->l->mx,u->r->mx));
    }
}
void split(pnode u,pnode &l,pnode &r,int key,int add)
{
    if(u==null)
        l=r=null;
    else
    {
        int rank=add+1+u->l->cnt;
        if(rank<=key)
        {
            split(u->r,u->r,r,key,rank);
            l=u;
        }
        else
        {
            split(u->l,l,u->l,key,add);
            r=u;
        }
    }
    update(u);
}
void merge(pnode &u,pnode l,pnode r)
{
    if(l==null)
        u=r;
    else if(r==null)
        u=l;
    else
    {
        if(l->prior > r->prior)
        {
            merge(l->r,l->r,r);
            u=l;
        }
        else
        {
            merge(r->l,l,r->l);
            u=r;
        }
    }
    update(u);
}
int query(pnode &u,int l,int r,int x,int y)
{
    if(x>r || y<l)
        return -2e9;
    if(x<=l && r<=y)
        return u->mx;
    int rank=l+u->l->cnt;
    int ret=-2e9;
    if(x<=rank && rank<=y)
        ret=u->val;
    ret=max(ret,query(u->l,l,rank-1,x,y));
    ret=max(ret,query(u->r,rank+1,r,x,y));
    return ret;
}
int main()
{
    null->l=null->r=null;
    null->val=null->mx=-2e9;
    null->cnt=0;
    int m;
    scanf("%d\n",&m);
    pnode root=null;
    int have=0;
    while(m--)
    {
        char ty;
        int x,y;
        scanf("%c %d %d\n",&ty,&x,&y);
        if(ty=='A')
        {
            pnode l,r;
            split(root,l,r,y-1,0);
            merge(l,l,init(x));
            merge(root,l,r);
            ++have;
        }
        else if(ty=='Q')
            printf("%d\n",query(root,1,have,x,y));
        else
            assert(0);
    }
}