萌新刚学主席树,92pts第一个sub的第二个点MLE
查看原帖
萌新刚学主席树,92pts第一个sub的第二个点MLE
218752
smy2006楼主2021/11/18 16:14

RT

#include<bits/stdc++.h>
using namespace std;
long long n,m,cnt,loc,valu;
struct TreePoint{
	long long l,r,val;
}tre[24000010];
long long root[1000010],arr[1000010];
inline long long read(){
	long long w=1,q=0;
	char ch=' ';
	while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
	if(ch=='-') w=-1,ch=getchar();
	while(ch<='9' && ch>='0') q=(q<<1)+(q<<3)+ch-'0',ch=getchar();
	return w*q;
}
int build(int l,int r,int p){
	p=++cnt;
	if(l==r){tre[p].val=arr[l];return p;}
	int mid=l+((r-l)>>1);
	tre[p].l=build(l,mid,tre[p].l);tre[p].r=build(mid+1,r,tre[p].r);
	return p;
}
inline int clone(int p){
	tre[++cnt]=tre[p];return cnt;
}
int update(int l,int r,int p){
	p=clone(p);
	if(l==r){tre[p].val=valu;return p;}
	int mid=l+((r-l)>>1);
	if(loc<=mid){ tre[p].l=update(l,mid,tre[p].l);}
	if(loc>mid){ tre[p].r=update(mid+1,r,tre[p].r);}
	return p;
}
long long vis(int l,int r,int p){
	if(l==r){return tre[p].val;}
	int mid=l+((r-l)>>1);
	if(loc<=mid){return vis(l,mid,tre[p].l);}
	if(loc>mid){return vis(mid+1,r,tre[p].r);}
}
int main(){
	n=read();m=read();
	for(int i=1; i<=n; i++) arr[i]=read();
	root[0]=build(1,n,0);
	int vs,op; 
	for(int i=1; i<=m; i++){
		vs=read(),op=read();
		if(op==1){
			loc=read();valu=read();
			root[i]=update(1,n,root[vs]);
		}else{
			loc=read();root[i]=root[vs];
			cout<<vis(1,n,root[vs])<<endl;
		}
	}
} 

改了半天,不是MLE就是RE,WA,关键下不了测试点

2021/11/18 16:14
加载中...