走过路过千万不要错过,30分蜜汁Wa+Re!
查看原帖
走过路过千万不要错过,30分蜜汁Wa+Re!
226523
RAYMOND_7楼主2020/10/5 17:32

#1和后面几个点全挂了,Re还能理解,wa就不知道了

求助啊

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
void read(int &x){
	char c=getchar();
	int k=1;
	while(c<'0'||c>'9') {if(c=='-') k=-1;c=getchar();}
	for(x=0;c>='0'&&c<='9';c=getchar())
	x=x*10+c-'0';
	x*=k;
}
const int N=1000005;
int n,m,a[N],x,l,r,s,ans,k,q,top,root[N];
struct kkk{
	int l,r,val;
}tree[N];
int clone(int node){//新建节点 
	top++;
	tree[top]=tree[node];
	return top;
}
int maketree(int node,int l,int r){
	node=++top;
	if(l==r){
		tree[node].val=a[l];return top;
	}
	int mid=l+r>>1;
	tree[node].l=maketree(tree[node].l,l,mid);
	tree[node].r=maketree(tree[node].r,mid+1,r);
	return node;
}
int update(int k,int l,int r,int x,int val){
	k=clone(k);
	if(l==r){
		tree[k].val=val;return k;
	}
	int mid=l+r>>1;
	if(x<=mid){
		tree[k].l=update(tree[k].l,l,mid,x,val);
	}
	else{
		tree[k].r=update(tree[k].r,mid+1,r,x,val);
	}
	return k;
}
int query(int k,int l,int r,int x){
	if(l==r) return tree[k].val;
	int mid=l+r>>1;
	if(x<=mid){
		return query(tree[k].l,l,mid,x);
	}
	else return query(tree[k].r,mid+1,r,x);
}
int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++){
		read(a[i]);
	}
	root[0]=maketree(0,1,n);
	for(int i=1;i<=m;++i){
		read(l);read(k);read(r);
		if(k==1){
			read(x);
			root[i]=update(root[l],1,n,r,x);
		}
		else{
			printf("%d\n",query(root[l],1,n,r));
			root[i]=root[l];
		}
	}
	return 0;
}

2020/10/5 17:32
加载中...