樹狀陣列 [區間加區間求和]
阿新 • • 發佈:2018-12-15
考慮差分
設
那麼
假設我們要求
那麼
sigma 中間的定值可以提出來
於是維護兩個差分陣列 di 與 i * di
#include<bits/stdc++.h> #define N 100050 #define LL long long using namespace std; LL t1[N],t2[N]; int n,m; void Up(int x,int val){ for(int i=x;i<=n;i+=i&-i) t1[i] += (LL)val , t2[i] += (LL)val * x; } LL Q(int x){ LL ans = 0; for(int i=x;i;i-=i&-i){ ans += (LL)(x+1) * t1[i]; ans -= t2[i]; } return ans; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int x; scanf("%d",&x); Up(i,x); Up(i+1,-x); } for(int i=1;i<=m;i++){ int op,x,y; scanf("%d%d%d",&op,&x,&y); if(op==1){ int val; scanf("%d",&val); Up(x,val) , Up(y+1,-val); } if(op==2) printf("%lld\n",Q(y)-Q(x-1)); } return 0; }