主席树WA 40pts求调
查看原帖
主席树WA 40pts求调
319995
THUD楼主2024/6/23 21:20

record

#include<bits/stdc++.h>
#define px first
#define py second
#define mkp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ostream_iterator<ll> output(cout," ");
const int N=1000005;
//const int MOD=;
typedef pair<int,int> P;
template<typename T>
struct Node{
	T sum;
	int ls,rs;
	Node(){sum=ls=rs=0;}
};
Node<int> tr[N<<5];
int tot=0;
template<typename T>
class Persistent_SegTree{
  public:
	void add(int ver,int i,const T& v){root.push_back(root[ver]),add(root.back(),1,n,i,v);}
	T sum(int ver,int l,int r){return query_sum(root[ver],1,n,l,r);}
	Persistent_SegTree(int si): n(si){root.push_back(++tot);}
	template<typename It> Persistent_SegTree(It beg,It ed):
	n(distance(beg,ed)){root.push_back(0),build(root[0],1,n,beg-1);}
	int copy_version(){root.push_back(root.back());return root.size()-1;}
	template<typename It>void insert_value(It beg,It ed){
		for(;beg!=ed;++beg) add(root[copy_version()],1,n,*beg,1);
	}
	//ÒÔÏÂΪ·Ç±ØÒªÄÚÈÝ
	int copy_version(int ver){root.push_back(root[ver]);return root.size()-1;}
	int last_version() const{return root.size()-1;}
	void del_version(){root.pop_back();}
	void del_version(int ver){root.erase(root.begin()+ver);}
	/*void print(){
		fprintf(stderr,"root:");for(int i:root) fprintf(stderr,"%d ",i);fprintf(stderr,"\n");
	}*/
  private:
  	int n;
  	int flag=false;
	vector<int> root;
	template<typename It>
	void build(int &i,int l,int r,const It& bg){
		i=++tot;
		if(l==r) tr[i].sum=*(bg+l);
		else{
			int mid=(l+r)>>1;
			build(tr[i].ls,l,mid,bg);
			build(tr[i].rs,mid+1,r,bg);
			tr[i].sum=tr[tr[i].ls].sum+tr[tr[i].rs].sum;
		}
	}
	void add(int& i,const int& nl,const int& nr,const int& x,const T& v){
		tr[++tot]=tr[i];
		i=tot;
		//cerr<<i<<": "<<nl<<" "<<nr<<endl;
		if(nl==nr) return void(tr[i].sum=v);
		int mid=(nl+nr)>>1;
		if(mid>=x) add(tr[i].ls,nl,mid,x,v);
		else add(tr[i].rs,mid+1,nr,x,v);
		tr[i].sum=tr[tr[i].ls].sum+tr[tr[i].rs].sum;
	}
	T query_sum(int i,const int& nl,const int& nr,const int& l,const int& r){
		if(nl>=l&&nr<=r) return tr[i].sum;
		int mid=(nl+nr)>>1;
		T ans=0;
		if(mid>=l&&tr[i].ls) ans+=query_sum(tr[i].ls,nl,mid,l,r);
		if(mid<r&&tr[i].rs) ans+=query_sum(tr[i].rs,mid+1,nr,l,r);
		return ans;
	}
};
int n,m,a[N];
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	Persistent_SegTree<int> x(a+1,a+n+1);
	//for(int i=1;i<=tot;i++) fprintf(stderr,"tr[%d]={%d,%d,%d}\n",i,tr[i].ls,tr[i].rs,tr[i].sum);
	//x.print();
	for(int i=1,op,v,loc,val;i<=m;i++){
        scanf("%d%d%d",&v,&op,&loc);
        if(op==1) scanf("%d",&val),x.add(v,loc,val);
        if(op==2) x.copy_version(),printf("%d\n",x.sum(v,loc,loc));
    }
	//cerr<<tr[0].ls<<" "<<tr[0].rs<<" "<<tr[0].sum<<endl;
	return 0;
}

码风诡异勿喷

2024/6/23 21:20
加载中...