主席树板子求调(模板一)
查看原帖
主席树板子求调(模板一)
127812
wycha楼主2022/10/27 22:14

前面一段是快读。 样例能过,又RE又WA

#include <bits/stdc++.h>
using namespace std;
#define out(x) wrt(x),ptc(' ')
#define oun(x) wrt(x),ptc('\n')
#define gtc getchar()
#define ptc(x) putchar(x)
#define il inline
#define ll long long
#define rd read()
#define rdl readl()
il int read(){int x=0;bool f=0;char c=gtc;while(c<'0'||c>'9'){if(c=='-')f=1;c=gtc;}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=gtc;return f?-x:x;}
il ll readl(){ll x=0;bool f=0;char c=gtc;while(c<'0'||c>'9'){if(c=='-')f=1;c=gtc;}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=gtc;return f?-x:x;}
il void wt(ll x){if(x>9)wt(x/10);ptc(x%10+48);}
il void wrt(ll x){if(x<0)ptc('-'),x=-x;wt(x);}

const int N=20000010;
int a[1000010];
int t[N];

int rt[1000010];
int ls[N],rs[N];
int cnt=0;

int build(int o,int l,int r){
	o=++cnt;
	if(r<=l){t[o]=a[l];return o;}
	int m=l+r>>1;
	ls[o]=build(ls[o],l,m);
	rs[o]=build(rs[o],m+1,r);
	return o;
}

int upd(int o,int l,int r,int k,int x){
	int o1=++cnt;
	if(r<=l){t[o1]=x;return o1;}
	int m=l+r>>1;
	ls[o1]=ls[o],rs[o1]=rs[o];
	if(k<=m)ls[o1]=upd(ls[o],1,m,k,x);
	else rs[o1]=upd(rs[o],m+1,r,k,x);
	return o1;
}

int que(int o,int l,int r,int k){
	if(r<=l)return t[o];
	int m=l+r>>1;
	if(k<=m)return que(ls[o],l,m,k);
	else return que(rs[o],m+1,r,k);
}

signed main(){
	
	int n=rd,q=rd;
	for(int i=1;i<=n;i++)a[i]=rd;
	
	int tot=0;
	rt[0]=build(0,1,n);
	for(int i=1;i<=q;i++){
		int root=rd,op=rd,k=rd;
		if(op==1){
			int w=rd;
			rt[i]=upd(rt[root],1,n,k,w);
		}else{
			oun(que(rt[root],1,n,k));
			rt[i]=rt[root];
		}
	}
	
	return 0;
}
2022/10/27 22:14
加载中...