块链求助,调了半个月
查看原帖
块链求助,调了半个月
363350
hxdts楼主2021/8/11 20:06
#include<bits/stdc++.h>
using namespace std;
const int blsize=300;
struct blist
{
	int a[blsize*10],cnt[70010],blcnt[blsize*3],size,last,next;
}w[blsize*10];
int n,m,x,y,k,cnt2,cnt[70010],blcnt[blsize*3],last,st[blsize*3],ed[blsize*3],bl[70010];
char c[1];
int read()
{
	char ch=getchar();
	int r=0,w=1;
	while(ch<'0'||ch>'9') w=ch=='-'?-1:w,ch=getchar();
	while(ch>='0'&&ch<='9') r=r*10+ch-'0',ch=getchar();
	return r*w;
}
void split(int x)
{
	w[++cnt2].size=w[x].size-blsize,w[x].size=blsize;
	w[cnt2].last=x,w[cnt2].next=w[x].next,w[x].next=cnt2,w[w[cnt2].next].last=cnt2;
//	cout<<w[x].next<<' '<<w[cnt2].next<<endl;
	memcpy(w[cnt2].cnt,w[x].cnt,sizeof(w[x].cnt));
	memcpy(w[cnt2].blcnt,w[x].blcnt,sizeof(w[x].blcnt));
	for(int i=1;i<=w[cnt2].size;i++)
	{
		w[cnt2].a[i]=w[x].a[i+blsize];
		w[x].cnt[w[cnt2].a[i]]--,w[x].blcnt[bl[w[cnt2].a[i]]]--;
	}
}
void insert(int x,int k)
{
	int blx=1;
	for(;w[blx].next&&x>w[blx].size;blx=w[blx].next)
	x-=w[blx].size;
	for(int i=w[blx].size;i>=x;i--)
	w[blx].a[i+1]=w[blx].a[i];
	w[blx].a[x]=k,w[blx].size++;
	for(int i=blx;i;i=w[i].next)
	w[i].cnt[k]++,w[i].blcnt[bl[k]]++;
	if(w[blx].size>=2*blsize)
	split(blx);
}
void add(int x,int k)
{
	int blx=1;
	for(;w[blx].next&&x>w[blx].size;blx=w[blx].next)
	x-=w[blx].size;
	for(int i=blx;i;i=w[i].next)
	w[i].cnt[w[blx].a[x]]--,w[i].blcnt[bl[w[blx].a[x]]]--,w[i].cnt[k]++,w[i].blcnt[bl[k]]++;
	w[blx].a[x]=k;
}
int ask(int x,int y,int k)
{
	int blx=1,bly=1;
	for(;w[blx].next&&x>w[blx].size;blx=w[blx].next)
	x-=w[blx].size;
	for(;w[bly].next&&y>w[bly].size;bly=w[bly].next)
	y-=w[bly].size;
	if(blx==bly)
	{
		for(int i=x;i<=y;i++)
		cnt[w[blx].a[i]]++,blcnt[bl[w[blx].a[i]]]++;
		for(int i=1;i<=blsize;i++)
		if(k<=blcnt[i])
		{
			for(int j=st[i];j<=ed[i];j++)
			if(k<=cnt[j])
			{
				for(int q=x;q<=y;q++)
				cnt[w[blx].a[q]]--,blcnt[bl[w[blx].a[q]]]--;
				return j;
			}
			else
			k-=cnt[j];
		}
		else
		k-=blcnt[i];
	}
	for(int i=x;i<=w[blx].size;i++)
	cnt[w[blx].a[i]]++,blcnt[bl[w[blx].a[i]]]++;
	for(int i=1;i<=y;i++)
	cnt[w[bly].a[i]]++,blcnt[bl[w[bly].a[i]]]++;
	for(int i=1;i<=blsize;i++)
	if(k<=blcnt[i]+w[w[bly].last].blcnt[i]-w[blx].blcnt[i])
	{
		for(int j=st[i];j<=ed[i];j++)
		if(k<=cnt[j]+w[w[bly].last].cnt[j]-w[blx].cnt[j])
		{
			for(int q=x;q<=w[blx].size;q++)
			cnt[w[blx].a[q]]--,blcnt[bl[w[blx].a[q]]]--;
			for(int q=1;q<=y;i++)
			cnt[w[bly].a[q]]--,blcnt[bl[w[bly].a[q]]]--;
			return j;
		}
		else
		k-=cnt[j]+w[w[bly].last].cnt[j]-w[blx].cnt[j];
	}
	else
	k-=blcnt[i]+w[w[bly].last].blcnt[i]-w[blx].blcnt[i];
}
int main()
{
	for(int i=1;i<=70005;i+=blsize)
	st[++cnt2]=i,ed[cnt2]=min(i+blsize-1,70005);
	for(int i=1;i<=cnt2;i++)
	for(int j=st[i];j<=ed[i];j++)
	bl[j]=i;
	n=read(),cnt2=bl[n];
	for(int i=1;i<bl[n];i++)
	w[i].next=i+1,w[i+1].last=i;
	for(int i=1;i<=n;i++)
	{
		w[bl[i]].size++,w[bl[i]].a[w[bl[i]].size]=read()+1;
		for(int j=bl[i];j;j=w[j].next)
		w[j].cnt[w[bl[i]].a[w[bl[i]].size]]++,w[j].blcnt[bl[w[bl[i]].a[w[bl[i]].size]]]++;
	}
	m=read();
	for(int i=1;i<=m;i++)
	{
		scanf("%s",c),x=read()^last,y=read()^last;
		if(c[0]=='Q')
		k=read()^last,printf("%d\n",last=ask(x,y,k)-1);
		else if(c[0]=='M')
		y++,add(x,y);
		else
		y++,insert(x,y);
	}
}
2021/8/11 20:06
加载中...