样例不过求tiao
查看原帖
样例不过求tiao
953850
qweasdqweasdqw楼主2025/1/3 09:30
#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
int n,m;
int L[N],R[N],sum[N],rt[N],tot;
int change(int p,int l,int r,int pos,int v)
{
	int rt=++tot;
	L[rt]=L[p];
	R[rt]=R[p];
	sum[rt]=sum[p]+v;
	if(l==r)return rt;
	int mid=(l+r)>>1;
	if(pos<=mid)
	L[rt]=change(L[rt],l,mid,pos,v);
	else
	R[rt]=change(R[rt],mid+1,r,pos,v);
	return rt;
}
int xx[N],yy[N],totx,toty;
int lowit(int x)
{
	return x&(-x);
}
int query(int l,int r,int k)
{
	if(l==r)return l;
	int num=0;
	int mid=(l+r)>>1;
	for(int i=1;i<=totx;i++)
	num-=sum[L[xx[i]]];
	for(int i=1;i<=toty;i++)
	num+=sum[L[yy[i]]];
	if(k<=num)
	{
		for(int i=1;i<=totx;i++)
		xx[i]=L[xx[i]];
		for(int i=1;i<=toty;i++)
		yy[i]=L[yy[i]];
		return query(l,mid,k);
	}
	else
	{
		for(int i=1;i<=totx;i++)
		xx[i]=R[xx[i]];
		for(int i=1;i<=toty;i++)
		yy[i]=R[yy[i]];
		return query(mid+1,r,k-num);
	} 
}
int a[N],b[N],totn;
void add(int x,int v)
{
	int k=lower_bound(b+1,b+1+totn,a[x])-b;
	for(int i=x;i<=n;i+=lowit(i))
	rt[i]=change(rt[i],1,totn,k,v);
}
char s[20],ca[N],cb[N],cc[N];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[i]=a[i];
	}
	totn=n;
	for(int i=1;i<=m;i++)
	{
		cin>>s;
		cin>>ca[i]>>cb[i];
		if(s[0]=='Q')
		{
			cin>>cc[i];
		}
		else
		b[++totn]=cb[i];
	}
	sort(b+1,b+1+totn);
	totn=unique(b+1,b+1+totn)-b-1;
	for(int i=1;i<=n;i++)
	add(i,1);
	for(int i=1;i<=m;i++)
	{
		if(cc[i])
		{
			totx=toty=0;
			for(int j=ca[i]-1;j;j-=lowit(j))
			xx[++totx]=rt[j];
			for(int j=cb[i];j;j-=lowit(j))
			yy[++toty]=rt[j];
			cout<<b[query(1,totn,cc[i])]<<endl;
		}
		else
		{
			add(ca[i],-1);
			a[ca[i]]=cb[i];
			add(ca[i],1);
		}
	}
}
2025/1/3 09:30
加载中...