死循环求助
查看原帖
死循环求助
285617
黑影洞人楼主2022/11/20 11:43
#include<cstdio>
#include<algorithm>
#define N 1214514
using namespace std;
int seed,p=19260817;
void _srand(int x){seed=x;}
int _rand(){seed=((((seed*7+114)*13%p)+514)*131)%p;return seed;}
int rt[N],tot,dep[N];
int n,m,q;
struct node{
	int rk,l,r; 
	node operator-(int a){return (node){rk-1,l,r};}
	bool operator<(const node &a)const{return rk<a.rk;}
	bool operator<=(const node &a)const{return rk<=a.rk;}
}val[N];
int ch[N][2],f[N],siz[N],s[N],rnd[N];
#define lc ch[x][0]
#define rc ch[x][1]
int newnode(node x){val[++tot]=x,siz[tot]=x.r-x.l+1,rnd[tot]=_rand();return tot;}
int update(int x){
	s[x]=s[lc]+s[rc]+val[x].r-val[x].l+1;
	siz[x]=siz[lc]+siz[rc]+1;
	return x;
}
void split(int p,node k,int &x,int &y){
	if(!p)return void(x=y=0);
	if(val[p]<=k)split(ch[x=p][1],k,ch[p][1],y);
	else split(ch[y=p][0],k,x,ch[p][0]);
	update(p);
}
int merge(int x,int y){
	if(!x||!y)return x+y;
	if(rnd[x]<rnd[y]){rc=merge(rc,y);return update(x);}
	else{ch[y][0]=merge(x,ch[y][0]);return update(y);}
}
void insert(int &rt,node v){
	int x,y;
	split(rt,v-1,x,y);
	rt=merge(merge(x,newnode(v)),y);
}
int rnk(int x,int k){
	while(1){
		if(siz[lc]+1==k)return x;
		if(k<=siz[lc])x=lc;
		else k-=siz[lc]+1,x=rc;
	}
}
int rkk(int x,int k){
//	printf("%d %d\n",x,k);
	while(1){
		//printf("%d %d\n",x,k);
		if(s[x]>=k&&k>=s[lc])return x;
		if(k<=s[lc])x=lc;
		else k-=s[x],x=rc;
	}
}
node kth(int x,int k){return val[rnk(x,k)];}
node kthk(int x,int k){return val[rkk(x,k)];}
int delrk(int &rt,int k){
	int x,y,z;
	node v=kthk(rt,k);
//	printf("%d %d\n",v.l,v.r);
	split(rt,v-1,y,z);
	split(rt,v,x,z);
	x=merge(lc,rc);
	rt=merge(merge(y,x),z);
	insert(rt,(node){v.rk,v.l,v.l+k-2});
	insert(rt,(node){v.rk+1,v.l+k,v.r});
	return v.l+k-1;
} 
signed main(){
	scanf("%d%d%d",&n,&m,&q);
	rt[0]=newnode((node){1,m,m});
	dep[0]=1;
	for(int i=1;i<=n;i++)rt[i]=newnode((node){1,(i-1)*m+1,i*m});
	for(int i=1;i<=n;i++)insert(rt[0],(node){++dep[0],i*m,i*m});
	while(q--){
		int x,y;
		scanf("%d%d",&x,&y);
		int res=delrk(rt[x],y);
		printf("%d\n",res);
		delrk(rt[0],x);
		insert(rt[0],(node){++dep[0],res,res});
	}
	return 0;
}



2022/11/20 11:43
加载中...