主席树可A,回头试试其他做法

const int N=1e5+86;
int root[N],len[N],tot;
char c[N*30];
struct Node
{
    int l,r;
}tr[N*30];


void build(int &rt,int l,int r){
    rt=++tot;
    if(l==r){
        c[rt]='#';
        return ;
    }
    int mid=(l+r)>>1;
    build(tr[rt].l,l,mid);
    build(tr[rt].r,mid+1,r);
}

void update(int &rt,int last,int l,int r,int pos,char ch){
    rt=++tot;
    if(l==r){
        c[rt]=ch;
        return ;
    }
    tr[rt]=tr[last];
    int mid=(l+r)>>1;
    if(pos<=mid)update(tr[rt].l,tr[last].l,l,mid,pos,ch);
    else update(tr[rt].r,tr[last].r,mid+1,r,pos,ch);
}

char query(int rt,int l,int r,int pos){
    if (l == r)
        return c[rt];
    int mid = (l + r) >> 1;
    if (pos <= mid)
        return query(tr[rt].l, l, mid, pos);
    else
        return query(rt[tr].r, mid + 1, r, pos);
}

LL n,cnt;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    build(root[0],1,n);
    f(i,1,n){
        char a;
        cin>>a;
        if(a=='T'){
            char ch;
            cin>>ch;
            cnt+=1;
            root[cnt]=root[cnt-1];
            len[cnt]=len[cnt-1]+1;
            update(root[cnt],root[cnt-1],1,n,len[cnt],ch);
        }
        else if(a=='U'){
            int d;
            cin>>d;
            cnt+=1;
            root[cnt]=root[cnt-d-1];
            len[cnt]=len[cnt-d-1];
        }
        else if(a=='Q'){
            int d;
            cin>>d;
            cout<<query(root[cnt],1,n,d)<<"\n";
        }
    }
    return 0;
}
此文章已被阅读次数:正在加载...更新于