16pts求助(第n次了)
查看原帖
16pts求助(第n次了)
476574
KAWorld楼主2023/7/12 14:23
//【模板】可持久化线段树/主席树 (单点修改, 单点查询) 
#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
inline int read(){
	int s=0,t=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') t=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*10+c-'0';c=getchar();
	}
	return s*t;
}
inline void write(int p){
	if(p<0){
		putchar('-');p=-p;
	}
	if(p<10){
		putchar(p+'0');return;
	}
	write(p/10);putchar(p%10+'0');
}
struct node{
	int s,ls,rs;
}t[MAXN<<5];
int a[MAXN],root[MAXN],tot=0;
inline void build(int &rt,int l,int r){
	if(!rt) rt=++tot;
	if(l==r){
		t[rt].s=a[l];return;
	}
	int mid=(l+r)>>1;
	build(t[rt].ls,l,mid);build(t[rt].rs,mid+1,r);
	t[rt].s=t[t[rt].ls].s+t[t[rt].rs].s;
}
inline void update(int rt1,int rt2,int l,int r,int loc,int value){
	if(l==r){
		t[rt1].s=value;return;
	}
	t[rt1].ls=t[rt2].ls;t[rt1].rs=t[rt2].rs;
	int mid=(l+r)>>1;
	if(loc<=mid){
		t[rt1].ls=++tot;update(t[rt1].ls,t[rt2].ls,l,mid,loc,value);
	}
	else{
		t[rt2].rs=++tot;update(t[rt1].rs,t[rt2].rs,mid+1,r,loc,value);
	}
	t[rt1].s=t[t[rt1].ls].s+t[t[rt1].rs].s;
}
inline int query(int rt,int l,int r,int pos){
	if(l==r) return t[rt].s;
	int mid=(l+r)>>1;
	if(pos<=mid) return query(t[rt].ls,l,mid,pos);
	else return query(t[rt].rs,mid+1,r,pos);
}
int main(){
	int n,m,p=0,v,op,l,w;
	n=read();m=read();
	for(register int i=1;i<=n;++i) a[i]=read();
	build(p,1,n);root[0]=1;
	for(register int i=1;i<=m;++i){
		v=read();op=read();l=read();
		if(op==1){
			w=read();root[i]=++tot;
			update(root[i],root[v],1,n,l,w);
		}
		else{
			root[i]=root[v];
			write(query(root[v],1,n,l));
			putchar('\n');
		}
	}
	return 0;
}

16pts求助,只A了#1和#3

2023/7/12 14:23
加载中...