社区讨论

主席树求调一下

P3919【模板】可持久化线段树 1(可持久化数组)参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lrxiw6zc
此快照首次捕获于
2024/01/28 21:14
2 年前
此快照最后确认于
2024/01/28 23:05
2 年前
查看原帖
呃呃呃我之前打过主席树,后来又忘了
又打了一份就死了
CPP
#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];
		}
	}
}

回复

2 条回复,欢迎继续交流。

正在加载回复...