真c++,直接退出,悬
#include<bits/stdc++.h>
#define mid(a,b) (a+((b-a)>>1))
#define z(a) (2*a)
#define y(a) (2*a+1)
using namespace std;
template <typename T>
class seg {
vector <T> tree,lazy,*arr;
int n,n4,endd,root;
void maintain(int s,int t,int p) {
if(s!=t&&lazy[p]) {
int m=mid(s,t);
tree[2*p]+=lazy[p]*(m-s+1);
tree[2*p+1]+=lazy[p]*(t-m);
lazy[2*p]+=lazy[p];
lazy[2*p+1]+=lazy[p];
lazy[p]=0;
}
}
void build(int s,int t,int p) {
if(s==t) {
tree[p]=(*arr)[s];
return;
}
int m=mid(s,t);
build(s,m,z(p));
build(m+1,t,y(p));
tree[p]=tree[z(p)]+tree[y(p)];
}
void range_add(int l,int r,int cl,int cr,int p,int x) {
if(l<=cl&&cr<=r) {
tree[p]+=(cr-cl+1)*x;
lazy[p]+=x;
return;
}
maintain(cl,cr,p);
int m=mid(cl,cr);
if(l<=m)range_add(l,r,cl,m,z(p),x);
if(m<r)range_add(l,r,m+1,cr,y(p),x);
tree[p]=tree[z(p)]+tree[y(p)];
}
T range_sum(int l,int r,int cl,int cr,int p) {
if(l<=cl&&r<=cr) {
return tree[p];
}
maintain(cl,cr,p);
int m=mid(cl,cr);
T sum=0;
if(l<=m)sum+=range_sum(l,r,cl,m,z(p));
if(m<r)sum+=range_sum(l,r,m+1,cr,y(p));
return sum;
}
public:
explicit seg<T>(vector <T> v) {
arr=&v;
n=v.size();
n4=n*4;
endd=n-1;
root=1;
vector <T> tree(n4,0);
vector <T> lazy(n4,0);
build(0,endd,root);
arr=nullptr;
}
T range_sum(int l,int r) {
return range_sum(l,r,0,endd,root);
}
void range_add(int l,int r,int x) {
return range_add(l,r,0,endd,root,x);
}
};
int main() {
vector <int> v= {1};
seg<int> s(v);
// cout<<s.range_sum(0,2);
return 0;
}