蒟蒻 TLE 50分 求条玄关
查看原帖
蒟蒻 TLE 50分 求条玄关
1171250
w132326820楼主2025/7/31 11:26
#include <bits/stdc++.h>

using namespace std;

const int N=5e6+110;
int n,m;

struct node{
	int l,r;
	int val,key;
	int sz;
}t[N];

int idx,root[N];
mt19937 rnd;

int newnode(int x){
	t[++idx].val=x;
	t[idx].key=rnd();
	t[idx].sz=1;
	return idx;
}
void push(int p){
	t[p].sz=t[t[p].l].sz+t[t[p].r].sz+1;
}

void split(int p,int x,int &A,int &B){
	if(!p){
		A=B=0;
		return ;
	}
	if(t[p].val<=x)A=p,split(t[p].r,x,t[p].r,B);
	else B=p,split(t[p].l,x,A,t[p].l);
	push(p);
}
int merge(int x,int y){
	if(!x||!y)return x+y;
	if(t[x].key<t[y].key){
		t[x].r=merge(t[x].r,y);
		push(x);
		return x;
	}
	else{
		t[y].l=merge(x,t[y].l);
		push(y);
		return y;
	}
}

struct LineTree{
	int l,r;
}a[N]; 
int bas[N];

void add(int p,int x){
	int a,b,c;
	split(root[p],x,a,b);
	c=newnode(x);
	root[p]=merge(merge(a,c),b);
} 
void del(int p,int x){
	int a,b,c;
	split(root[p],x,a,b);
	split(a,x-1,a,c);
	c=merge(t[c].l,t[c].r);
	root[p]=merge(merge(a,c),b);
}
int kso(int p,int x){
	int a,b;
	split(root[p],x-1,a,b);
	int kk=t[a].sz+1;
	root[p]=merge(a,b);
	return kk; 
}

void buildtree(int p,int l,int r){
	a[p].l=l;
	a[p].r=r;
	for(int i=l;i<=r;i++){
		add(p,bas[i]);
	}
	if(l==r)return ;
	buildtree(p<<1,l,(l+r)>>1);
	buildtree(p<<1|1,((l+r)>>1)+1,r);
}
int kso_(int p,int l,int r,int x){
	if(a[p].l>=l&&a[p].r<=r){
		return kso(p,x)-1;
	}
	int kk=0;
	if((a[p].l+a[p].r)>>1>=l)kk+=kso_(p<<1,l,r,x);
	if(((a[p].l+a[p].r)>>1)+1<=r)kk+=kso_(p<<1|1,l,r,x);
	return kk;
}
int kth_(int l,int r,int x){
	int L=0,R=1e8;
	int ans=0;
	while(L<R){
		int mid=(L+R+1)>>1;
		if(kso_(1,l,r,mid)+1<=x){
			L=mid;
		}
		else R=mid-1;
	}
	return L;
}
void add_(int p,int l,int x){
	del(p,bas[l]);
	add(p,x);
	if(a[p].l==a[p].r)return ;
    (a[p].l+a[p].r)>>1>=l?add_(p<<1,l,x):add_(p<<1|1,l,x);
}

int main(){
    
	srand(time(NULL));
	rnd.seed(rand()^time(NULL));

	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>bas[i];
	}
	buildtree(1,1,n);
	
	while(m--){
        char c;
		int opt,l,r,x;
		cin>>c>>l>>r;
        c=='Q'?opt=2:opt=3;
		if(opt==2){
			cin>>x;
			printf("%d\n",kth_(l,r,x));
		}
		if(opt==3){
			add_(1,l,r);
			bas[l]=r; 
		}
	}
	return 0;
}
2025/7/31 11:26
加载中...