1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #define lowbit(x) ((x) & (-(x)))
const ll N=5e5+5; struct BiTree{ vector<ll> data; int fl; ll n; BiTree():data(N*2+5,0),fl(0),n(0){} void build(vector<ll>& v,int fl=0){ clear(); this->fl=fl; n=v.size()-1; if(fl){ for(ll i=1;i<=n;i++) update(i,v[i]-v[i-1]); } else { for(ll i=1;i<=n;i++) update(i,v[i]); } } ll presum(ll i){ ll sum=0; while(i){ sum+=data[i]; i-=lowbit(i); } return sum; } void clear(){ for(ll i=0;i<=n*2+1;i++) data[i]=0; }
void update(ll i,ll dif){ while(i<data.size()){ data[i]+=dif; i+=lowbit(i); } } ll query(ll l,ll r){ assert(fl==0); return presum(r)-presum(l-1); }
void update(ll l,ll r,ll dif){ assert(fl==1); update(l,dif); update(r+1,-dif); } ll query(ll i){ assert(fl==1); return presum(i); } } bt; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,q;cin >> n >> q; vector<ll> v(n+1,0); for(ll i=1;i<=n;i++) cin >> v[i]; ll op,x,y,k; bt.build(v,0); for(ll i=0;i<q;i++){ cin >> op; if(op==1){ cin >> x >> k; bt.update(x,k); }else{ cin >> x >> y; cout << bt.query(x,y) << endl; } } }
|