【求助】主席树模板
查看原帖
【求助】主席树模板
70299
Andysun06楼主2021/8/13 15:07
#include<iostream>
#include<cstdio>
#define reint register int
using namespace std;
int n,m;
inline void read(int &a) {
	int x(0),y(1);
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-')y=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	a=x*y;
	return;
}
inline void write(int x) {
	if(x<0) {
		putchar('-');
		x=-x;
		write(x);
	} else {
		if(x>9) {
			write(x/10);
		}
		putchar(x%10+'0');
	}
}

int s[1000005],v,loc,value,p,root[1000005],top;
struct nod {
	int l,r,val;
} tree[20000005];

int add(int node) {
	++top;
	tree[top]=tree[node];
	return top;
}

int update(int node,int l,int r,int loc,int valus) {
	node=add(node);
	if(l==r) {
		tree[l].val=valus;
	} else {
		int mid=(l+r)>>1;
		if(loc<=mid) {
			tree[node].l=update(tree[node].l,l,mid,loc,valus);
		} else {
			tree[node].r=update(tree[node].r,mid+1,r,loc,valus);
		}
	}
	return node;
}

int build(int node,int l,int r) {
	node=++top;
	if(l==r) {
		tree[node].val=s[l];
		return top;
	}
		int mid=(l+r)>>1;
		tree[node].l=build(tree[node].l,l,mid);
		tree[node].r=build(tree[node].r,mid+1,r);
		return node;    
	
}

int query(int node,int l,int r,int loc) {  
	if(l==r) {
		return tree[node].val;
	} else {
		int mid=(l+r)>>1;
		if(loc<=mid)
			return query(tree[node].l,l,mid,loc);
		else
			return query(tree[node].r,mid+1,r,loc);
	}
}

int main() {
	reint i;
	scanf("%d",&n);
	scanf("%d",&m);
	for(i=1; i<=n; ++i) {
		scanf("%d",&s[i]);
	}
	root[0]=build(0,1,n);
	for(i=1; i<=m; ++i) {
		scanf("%d",&v);
		scanf("%d",&p);
		scanf("%d",&loc);
		if(p==1) {
			scanf("%d",&value);
			root[i]=update(root[v],1,n,loc,value);
		} else {
			printf("%d",query(root[v],1,n,loc));
			root[i]=root[v];
			putchar('\n');
		}
	}
}

改了一上午了,以至于改的我觉得都和题解一模一样了,还是全WA,有没有哪位大佬能帮忙看看是哪里的问题?谢谢!

2021/8/13 15:07
加载中...