线段树 Why RE?
查看原帖
线段树 Why RE?
1121995
2021zjhs005楼主2024/3/26 06:45

rt。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define rrep(i,x,y) for(int i=x;i>=y;i--)
#define sc scanf
#define pr printf
inline int read(){int s=0,w=1;char c=getchar();while(!isdigit(c)){if(c=='-') w=-1;c=getchar();}while(isdigit(c)){s=(s<<1)+(s<<3)+(c^48);c=getchar();}return s*w;}

const int N=5e5+10;
struct Tree{
  int l,r,sum;
};
Tree tr[N << 2];

int a[N];

inline void pushup(int u){
  tr[u].sum=tr[u << 1].sum + tr[u << 1 | 1].sum;
}

inline void build(int u,int l,int r){
  tr[u]={l,r};
  if(l==r){
    tr[u].sum=a[l];
    return;
  }
  int mid=((l + r) >> 1);
  build ( u << 1 , l , mid);
  build ( u << 1 | 1 , mid + 1 , r);
  pushup(u);
}

inline void update(int u , int id , int d){
  int l = tr[u].l , r = tr[u].r ;
  if(l == r && l == id){
    tr[u].sum += d;
    return;
  }
  int mid = ((l + r) >> 1);
  if(id <= mid) update(u << 1 , id , d);
  else update(u << 1 | 1 , id , d);
  pushup(u);
}

inline int query(int u , int L , int R){
  int l=tr[u].l , r = tr[u].r , mid = ((l + r) >> 1);
  if(l >= L && r <= R) return tr[u].sum;
  int val = 0;
  if(L <= mid) val += query(u << 1 , L , R);
  if(mid < r) val += query(u << 1 | 1 , L , R);
  return val;
}

signed main(){
  int n,Q,opt,x,y;
  n=read();Q=read();
  rep(i,1,n) a[i]=read();
  build(1,1,n);
  
  while(Q--){
    opt=read();x=read();y=read();
    if(opt == 1) update (1 , x , y);
    else pr("%lld\n" , query (1 , x , y));
  }
  return 0;
}
2024/3/26 06:45
加载中...