C82 树状数组 区修+区查 P3372 线段树1

视频链接:C82 树状数组 区修+区查 Luogu P3372 线段树 1_哔哩哔哩_bilibili

 Luogu P3372【模板】线段树 1

// 树状数组 区修+区查 O(nlogn)
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=100005;
int n,m; 

struct BIT{
  int s[N];
  void change(int x,int w){
    for(;x<=n;x+=x&-x) s[x]+=w;
  }
  int query(int x){
    int res=0;
    for(;x;x-=x&-x) res+=s[x];
    return res;
  }
}a,b; //a维护di的区间和, b维护di*(i-1)的区间和
signed main(){
  ios::sync_with_stdio(0);
  cin>>n>>m; int op,x,y,k;
  for(int i=1;i<=n;i++){ //点修
    cin>>k;
    a.change(i,k); 
    a.change(i+1,-k);
    b.change(i,k*(i-1));
    b.change(i+1,-k*i);
  }
  for(int i=1;i<=m;i++){
    cin>>op>>x>>y;
    if(op==1){ //区修
      cin>>k;
      a.change(x,k);
      a.change(y+1,-k);
      b.change(x,k*(x-1));
      b.change(y+1,-k*y);
    }
    else{ //区查
      cout<<(a.query(y)*y-b.query(y))
           -(a.query(x-1)*(x-1)-b.query(x-1))<<"\n";
    }
  }
}

 

posted @ 2023-12-29 10:14  董晓  阅读(624)  评论(0)    收藏  举报