报废主席树求助
查看原帖
报废主席树求助
494601
gcx12012楼主2023/4/16 21:20
#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define N 100010

using namespace std;
int root[N];
struct node{
    int siz,ls,rs;
    char sh;
}tree[N<<5];
int q,sum=0,cnt=1;
void add(int l,int r,char x,int pre,int &p){
    p=++cnt;
    tree[p].ls=tree[pre].ls;
    tree[p].rs=tree[pre].rs;
    tree[p].sh=tree[pre].sh;
    tree[p].siz=tree[pre].siz;
    if(l>r) return;
    if(l==r){
        tree[p].sh=x;
        tree[p].siz=1;
        return;
    }
    int mid=(l+r)/2;
    if(tree[tree[p].ls].siz==mid-l+1) add(mid+1,r,x,tree[pre].rs,tree[p].rs);
    else add(l,mid,x,tree[pre].ls,tree[p].ls);
    tree[p].siz=tree[tree[p].ls].siz+tree[tree[p].rs].siz;
}
char query(int l,int r,int x,int y){
    if(l>=r){
        return tree[x].sh;
    }
    int mid=(l+r)/2;
    if(y>tree[tree[x].ls].siz) return query(mid+1,r,tree[x].rs,y-tree[tree[x].ls].siz);
    else return query(l,mid,tree[x].ls,y);
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
    cin>>q;
    while(q--){
        char q1;
        cin>>q1;
        if(q1=='T'){
            sum++;
            char q2;
            cin>>q2;
            add(1,q,q2,root[sum-1],root[sum]);
        }else if(q1=='U'){
            int q2;
            cin>>q2;
            sum++;
            root[sum]=root[sum-q2-1];
        }else{
            int q2;
            cin>>q2;
            cout<<query(1,q,root[sum],q2)<<endl;
        }
    }
	return 0;
}

2023/4/16 21:20
加载中...