救救孩子.......
查看原帖
救救孩子.......
886055
MoonCake2011楼主2023/10/1 13:25

卡常卡不下去了,不想用快读与快写。

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
	node *l,*r;
	int val;
}*root[int(1e6)+10];
int tot;
node *null;
void _init(){
	tot=0;
	null=new node;
	null->l=null->r=null;
	null->val=0;
}
inline node *build(int a[],int l,int r){
	if(l==r){
		node *p=new node;
		p->l=p->r=null;
		p->val=a[l];
		return p;
	}
	int mid=l+r>>1;
	node *p=new node;
	p->l=build(a,l,mid);
	p->r=build(a,mid+1,r);
	p->val=p->l->val+p->r->val;
	return p; 
}
void creat(int a[],int l=1,int r=n){
	_init();
	root[tot]=build(a,l,r);
}
inline node *update(int x,int k,node *p,int l=1,int r=n){//单点修改 
	if(l==r && r==x){
		register node *q=new node;
		q->l=q->r=null;
		q->val=k;
		return q;
	}
	register node *q=new node;
	q->l=p->l,q->r=p->r;
	register int mid=l+r>>1;
	if(x>=l && x<=mid) q->l=update(x,k,p->l,l,mid);
	else q->r=update(x,k,p->r,mid+1,r); 
	q->val=q->l->val+q->r->val;
	return q;
}
inline int ask(int x,node *p,int l=1,int r=n){//单点查询 
	if(l==r && r==x) return p->val;
	register int mid=l+r>>1;
	if(x>=l && x<=mid) return ask(x,p->l,l,mid);
	else return ask(x,p->r,mid+1,r); 
}
int a[int(1e6)+10];
int main() {
	cin>>n>>m;
	for(int *i=a+1;i<=a+n;i++)
		scanf("%d",i);
	creat(a);
	while(m--){
		register int v,opt;
		scanf("%d%d",&v,&opt);
		if(opt==1){
			register int x,k;
			scanf("%d%d",&x,&k);
			root[++tot]=update(x,k,root[v]);
		}
		else{
			register int x;
			scanf("%d",&x);
			printf("%d\n",ask(x,root[v]));
			root[++tot]=root[v];
		}
	}
	return 0;
} 
2023/10/1 13:25
加载中...