34pts求助
查看原帖
34pts求助
957618
oyoham楼主2024/7/2 21:07
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
inline ll read(){
	ll x=0;
	short f=1;
	char c=getchar();
	while(c>57||c<48){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c<58&&c>47){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void write(ll x){
	if(x>>63) putchar(45),x=~x+1;
	if(9-x>>63) write(x/10);
	putchar(x%10|48);
}
int n=read(),m=read();
int rt[2000005],ct[50000005],ls[50000005],rs[50000005],cnt,I=1;
#define pu(id) ct[id]=ct[ls[id]]+ct[rs[id]];
void addv(int p,int v,int &id,int nl=1,int nr=100000){
	if(!id) id=++cnt;
	if(nl==nr){
		ct[id]+=v;
		return;
	}
	if(p<=nl+nr>>1) addv(p,v,ls[id],nl,nl+nr>>1);
	else addv(p,v,rs[id],(nl+nr>>1)+1,nr);
	pu(id);
}
int merge(int a,int b,int nl=1,int nr=100000){//merge a and b
	if(!a||!b) return a|b;
	if(nl==nr){
		ct[a]+=ct[b];
		return a;
	}
	ls[a]=merge(ls[a],ls[b],nl,nr+nl>>1);
	rs[a]=merge(rs[a],rs[b],(nl+nr>>1)+1,nr);
	pu(a);
	return a;
}
void split(int &fr,int &to,int ql,int qr,int nl=1,int nr=100000){
	if(!fr) return;
	if(!to) to=++cnt;
	if(qr<nl||nr<ql) return;
	if(ql<=nl&&nr<=qr){
		to=fr;
		fr=0;
	}
	if(nl==nr) return;
	split(ls[fr],ls[to],ql,qr,nl,nl+nr>>1);
	split(rs[fr],rs[to],ql,qr,(nl+nr>>1)+1,nr);
	pu(fr);
	pu(to);
}
int find(int id,int ql,int qr,int nl=1,int nr=100000){
	if(nr<ql||nl>qr||!id) return 0;
	if(ql<=nl&&nr<=qr) return ct[id];
	return find(ls[id],ql,qr,nl,nl+nr>>1)+find(rs[id],ql,qr,(nl+nr>>1)+1,nr);
}
int kth(int id,int p,int nl=1,int nr=100000){
	if(nl==nr) return nl;
	if(ct[ls[id]]<p) return kth(rs[id],p-ct[ls[id]],(nl+nr>>1)+1,nr);
	else return kth(ls[id],p,nl,nl+nr>>1);
}
signed main(){
	for(int i=1;i<=n;i++){
		int x=read();
		if(x){
			addv(i,x,rt[1]);
		}
	}
	for(int i=1;i<=m;i++){
		int op=read(),p=read(),x=read();
//		printf("ORDER %d,(%d)\n",op,p);
		if(op==0){
			split(rt[p],rt[++I],x,read());
		}
		if(op==1){
			rt[p]=merge(rt[p],rt[x]);
		}
		if(op==2){
			addv(read(),x,rt[p]);
		}
		if(op==3){
			write(find(rt[p],x,read()));putchar(10);
		}
		if(op==4){
			write(ct[rt[p]]<x?-1:kth(rt[p],x));putchar(10);
		}
//		for(int i=1;i<=I;i++){
//			printf("%d-%d",i,ct[rt[i]]);
//			for(int j=1;j<=ct[rt[i]];j++) printf("%d ",kth(rt[i],j));
//			putchar(10);
//		} 
	}
}

rt

2024/7/2 21:07
加载中...