求救求救,100pts的主席树只得了50pts,嘤嘤嘤,就是所谓IOI挑战的那些点
#include<bits/stdc++.h>
using namespace std;
int sj=0;
int ttt=0;
int len[100100];
char zj[1001000];
int lc[1001000];
int rc[1001000];
int rt[100100];
int m;
void modi(int &now,int pre,char o,int ll,int rr,int pos)
{
if(now==0)now=++ttt;
if(ll==rr)
{
zj[now]=o;
return;
}
int mid=(ll+rr)/2;
lc[now]=lc[pre];
rc[now]=rc[pre];
if(pos<=mid)modi(lc[now],lc[pre],o,ll,mid,pos);
else modi(rc[now],rc[pre],o,mid+1,rr,pos);
}
char que(int now,int ll,int rr,int pos)
{
if(ll==rr)
return zj[now];
int mid=(ll+rr)/2;
if(pos<=mid)return que(lc[now],ll,mid,pos);
else return que(rc[now],mid+1,rr,pos);
}
int main()
{
char op[55],x[55];
int i,aa;
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%s",op);
if(op[0]=='T')
{
scanf("%s",x);
sj++;
len[sj]=len[sj-1]+1;
modi(rt[sj],rt[sj-1],x[0],1,m,len[sj]);
}
else if(op[0]=='U')
{
scanf("%d",&aa);
sj++;
rt[sj]=rt[sj-aa-1];
len[sj]=len[sj-aa-1];
}
else
{
scanf("%d",&aa);
cout<<que(rt[sj],1,m,aa)<<endl;
}
}
return 0;
}