http://acm.hdu.edu.cn/showproblem.php?pid=4348
sb的标记永久化即可,刚开始add和sum没复制过来wa了两发。。。,操作和原来的都一样,出来单点变成区间,还要加一个标记永久化,这样就不用pushdown新加节点而爆内存了
#include#define fi first#define se second#define mp make_pair#define pb push_back#define pi acos(-1.0)#define ll long long#define mod 1000000007#define C 0.5772156649//#define ls l,m,rt<<1//#define rs m+1,r,rt<<1|1#define pil pair #define pii pair #define ull unsigned long long#define base 1000000000000000000#define fio ios::sync_with_stdio(false);cin.tie(0)using namespace std;const double g=10.0,eps=1e-12;const int N=100000+10,maxn=90000+10,inf=0x3f3f3f3f;int rt[N],tot,ls[N*30],rs[N*30];ll sum[N*30],add[N*30];void build(int &o,int l,int r){ o=++tot; add[o]=0; if(l==r) { scanf("%lld",&sum[o]); return ; } int m=(l+r)>>1; build(ls[o],l,m); build(rs[o],m+1,r); sum[o]=sum[ls[o]]+sum[rs[o]];// printf("%d+++%d+++%d+++%lld+++%d\n",l,r,o,sum[o],add[o]);}void update(int &o,int l,int r,int last,int L,int R,int x){ o=++tot; ls[o]=ls[last]; rs[o]=rs[last]; sum[o]=sum[last]; add[o]=add[last]; if(L<=l&&r<=R) { add[o]+=x; return ; } int m=(l+r)>>1; if(L<=m)update(ls[o],l,m,ls[last],L,R,x); if(m >1; if(L<=m)ans+=query(ls[o],ad+add[o],l,m,L,R); if(m