题目链接:传送门
题解:
貌似我只会写块链
//by sdfzchy
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int inf=(1<<30),N=100010,mod=1e9+7;
int n,m;
inline int in()
{
char tmp=getchar();
int res=0,f=1;
while((tmp<'0'||tmp>'9')&&tmp!='-')tmp=getchar();
if(tmp=='-') f=-1,tmp=getchar();
while(tmp>='0'&&tmp<='9') res=(res<<1)+(res<<3)+(tmp^48),tmp=getchar();
return res*f;
}
int Bo=600;
int la,cnt,a[200][1210],c[200][1210],siz[210],nxt[210];
char s[10];
void change(int pos,int x)
{
int k=1,p=1;
while(pos>siz[k]&&nxt[k]) pos-=siz[k],k=nxt[k];
int val=a[k][pos];a[k][pos]=x;
for(p=1;p<=siz[k];p++) if(c[k][p]==val) break; c[k][p]=x;
for(int i=p-1;i>=1;i--) if(c[k][i]>c[k][i+1]) swap(c[k][i],c[k][i+1]);
for(int i=p+1;i<=siz[k];i++) if(c[k][i]<c[k][i-1]) swap(c[k][i],c[k][i-1]);
}
void reset(int x)
{
++cnt;
nxt[cnt]=nxt[x];nxt[x]=cnt;
siz[cnt]=siz[x]=Bo;
for(int i=1;i<=Bo;i++) c[x][i]=a[x][i],c[cnt][i]=a[cnt][i]=a[x][i+Bo];
sort(c[x]+1,c[x]+siz[x]+1);
sort(c[cnt]+1,c[cnt]+siz[cnt]+1);
}
void ins(int pos,int x)
{
int k=1,p=1;
while(pos>siz[k]&&nxt[k]) pos-=siz[k],k=nxt[k]; siz[k]++;
for(int i=siz[k];i>pos;i--) a[k][i]=a[k][i-1]; a[k][pos]=x;
if(siz[k]==2*Bo) reset(k);
else
{
c[k][siz[k]]=x;p=siz[k];
while(p>1&&c[k][p]<c[k][p-1])
swap(c[k][p],c[k][p-1]),p--;
}
}
int ask(int x,int val)
{
int l=1,r=siz[x],ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(c[x][mid]<val) l=mid+1,ans=mid;
else r=mid-1;
}
return ans;
}
int query(int l,int r,int k)
{
int kl=1,kr=1;
while(l>siz[kl]&&nxt[kl]) l-=siz[kl],kl=nxt[kl];
while(r>siz[kr]&&nxt[kr]) r-=siz[kr],kr=nxt[kr];
int ans=0,mid,tot=0,L=0,R=70000;
while(L<=R)
{
tot=0;
mid=(L+R)>>1;
if(kl!=kr)
{
if(nxt[kl]!=kr) for(int i=nxt[kl];i!=kr;i=nxt[i]) tot+=ask(i,mid);
for(int i=l;i<=siz[kl];i++) if(a[kl][i]<mid) tot++;
for(int i=1;i<=r;i++) if(a[kr][i]<mid) tot++;
}
else for(int i=l;i<=r;i++) if(a[kl][i]<mid) tot++;
if(tot<k) ans=mid,L=mid+1;
else R=mid-1;
}
return ans;
}
void de()
{
cout<<endl;
for(int i=1;i;i=nxt[i])
for(int j=1;j<=siz[i];j++)
{
cout<<a[i][j]<<" ";
if(j==siz[i]) cout<<endl;
}
cout<<endl<<endl;
for(int i=1;i;i=nxt[i])
for(int j=1;j<=siz[i];j++)
{
cout<<c[i][j]<<" ";
if(j==siz[i]) cout<<endl;
}
cout<<endl;
}
int main()
{
n=in();
for(int i=1;i<=n;i++)
a[(i-1)/Bo+1][(i-1)%Bo+1]=c[(i-1)/Bo+1][(i-1)%Bo+1]=in();
cnt=(n-1)/Bo+1;
for(int i=1;i<cnt;i++) siz[i]=Bo,nxt[i]=i+1;
siz[cnt]=n-(cnt-1)*Bo;
for(int i=1;i<=cnt;i++) sort(c[i]+1,c[i]+siz[i]+1);
m=in();
for(int i=1,l,r;i<=m;i++)
{
scanf("%s",s);
l=in()^la,r=in()^la;
if(s[0]=='Q') printf("%d\n",la=query(l,r,in()^la));
else if(s[0]=='M') change(l,r);
else ins(l,r);
}
return 0;
}