Untitled
unknown
plain_text
a year ago
1.7 kB
4
Indexable
ll merge(ll x,ll y) { return x+y; } struct segment_tree { vector<ll>tree; vector<ll>lazy; void build(vector<ll>&a,int ns=0,int ne=n1-1,int id=0) { if (ns==ne) { tree[id]=a[ns]; return ; } ll l=2*id+1,r=l+1; ll mid=(ns+ne)/2 ; build(a,ns,mid,l); build(a,mid+1,ne,r); tree[id]=merge(tree[l],tree[r]); } void init(vector<ll>&a,int ne) { n1=ne; tree.assign(4*ne,0ll); lazy.assign(4*ne,0ll); build(a); } ll query(ll qs,ll qe,ll id=0,ll ns=0,ll ne=n1-1) { update_lazy(id,ns,ne); if (ns>qe || qs>ne) { return 0; } if (ns>=qs && ne<=qe) return tree[id]; ll l=2*id+1; ll r=l+1; ll mid=(ns+ne)/2; ll a1= query(qs,qe,l,ns,mid); ll b1= query(qs,qe,r,mid+1,ne); return merge(a1,b1); } void update_lazy(int id,int ns,int ne=n1-1) { if (lazy[id]) tree[id]=lazy[id]*(ne-ns+1); if (ns!=ne) { ll l=2*id+1; ll r=l+1; lazy[l]+=lazy[id]; lazy[r]+=lazy[id]; } lazy[id]=0; } void upd(int qs,int qe,ll value,ll id=0,int ns=0,int ne=n1-1) { update_lazy(id,ns,ne); if (qs>ne || ns>qe) return ; if (qs<=ns && qe>=ne) { lazy[id]=value; update_lazy(id,ns,ne); return ; } ll l=2*id+1,r=l+1; ll mid=(ns+ne)/2; upd(qs,qe,value,l,ns,mid); upd(qs,qe,value,r,mid+1,ne); tree[id]=merge(tree[l],tree[r]); } };
Editor is loading...
Leave a Comment