Another Array of Orz Pandas
题目链接:
线段树
线段树维护区间和以及区间内各个数平方和,对于每一个询问ans=(sum2-pow_sum)/2
代码如下:
1 #include2 #include 3 #define lson (x<<1) 4 #define rson (x<<1|1) 5 #define mid ((l+r)>>1) 6 #define N 100007 7 typedef long long LL; 8 struct nod{ 9 LL sum,lazy,or2zds;10 }a[N<<2];11 const LL mod=1e9+7;12 const LL Max=1e9;13 LL n,m;14 void push_up(LL x){15 a[x].sum=(a[lson].sum+a[rson].sum)%mod;16 a[x].or2zds=(a[lson].or2zds+a[rson].or2zds)%mod;17 }18 void push_down(LL x,LL l,LL r){19 a[lson].or2zds=(a[lson].or2zds+(a[x].lazy*a[x].lazy)%mod*(mid+1-l)+2*a[x].lazy*a[lson].sum+mod)%mod;20 a[lson].sum=(a[lson].sum+a[x].lazy*(mid+1-l))%mod;21 a[lson].lazy=(a[lson].lazy+a[x].lazy)%mod;22 a[rson].or2zds=(a[rson].or2zds+(a[x].lazy*a[x].lazy)%mod*(r-mid)+2*a[x].lazy*a[rson].sum+mod)%mod;23 a[rson].sum=(a[rson].sum+a[x].lazy*(r-mid))%mod;24 a[rson].lazy=(a[rson].lazy+a[x].lazy)%mod;25 a[x].lazy=0;26 }27 void add(LL x,LL l,LL r,LL cl,LL cr,LL v){28 if(cl<=l&&r<=cr){29 a[x].or2zds=(a[x].or2zds+(v*v)%mod*(r-l+1)%mod+2*v*a[x].sum)%mod;30 a[x].sum=(a[x].sum+v*(r-l+1))%mod;31 a[x].lazy=(a[x].lazy+v)%mod;32 return;33 }34 if(a[x].lazy!=0)push_down(x,l,r);35 if(cl<=mid)add(lson,l,mid,cl,cr,v);36 if(mid