主席树求调一下
查看原帖
主席树求调一下
1000298
Vsinger_洛天依楼主2024/1/28 21:13

呃呃呃我之前打过主席树,后来又忘了

又打了一份就死了

#include<bits/stdc++.h>
#define lc t[q].ls
#define rc t[q].rs
#define mid ((l+r)/2)
#define int long long
using namespace std;
int n,m,a[0x66ccff],tot,root[0x66ccff];
inline int read(){
    int f=1,x=0;char ch;
    while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-')f=-1;};
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();};
    return f*x;
}
struct node{
	int l,r,ls,rs;
    int lazy,dat;
}t[0x66ccff];
void build(int &q, int l, int r){
	q=++tot;
	if(l==r){
		t[q].dat=a[l];
		return;
	}
	build(lc,l,mid);
	build(rc,mid+1,r);
}
inline void insert(int &qwq,int q,int l,int r,int i,int val){
    qwq=++tot;
    t[q].l=l;t[q].r=r;
    if(l==r){
        t[q].dat=val;
        return;
    }
    if(i<=mid) insert(t[qwq].ls,lc,l,mid,i,val);
    else insert(t[qwq].rs,rc,mid+1,r,i,val);
    t[q].dat=t[lc].dat+t[rc].dat;
}
inline int ask(int q,int l,int r){
    if(!q) return 0;
    if(t[q].l>r||t[q].r<l) return 0;
	if(t[q].l>=l&&t[q].r<=r) return t[q].dat;
	return ask(lc,l,r)+ask(rc,l,r); 
}
signed main(){
    freopen("1.in","r",stdin);
	n=read(),m=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    build(root[0],1,n);
	for(int i=1;i<=m;i++){
		int qwq=read(),opt=read(),x=read();
		if(opt==1){
            int y=read();
			insert(root[i],root[qwq],1,n,x,y);
		}
		else{
			cout<<ask(root[qwq],x,x)<<endl;
            root[i]=root[qwq];
		}
	}
}
2024/1/28 21:13
加载中...