
線段樹
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5+5;
struct seg{
int L,R;
int sum;
int lson, rson;
} ST[maxn*4];
int stptr = 1;
vector<int> v;
void build(int L,int R,int idx){
ST[idx].L = L, ST[idx].R = R;
if(L+1 == R){
ST[idx].sum = v[L];
return;
}
int mid = (L+R) / 2;
int lson = ST[idx].lson = stptr++;
int rson = ST[idx].rson = stptr++;
build(L,mid,lson);
build(mid,R,rson);
ST[idx].sum = ST[lson].sum + ST[rson].sum;
}
void modify(int pos,int x,int idx){
int L = ST[idx].L, R = ST[idx].R;
int mid = (L+R) / 2;
if(L+1 == R){
ST[idx].sum = x;
return;
}
int lson = ST[idx].lson, rson = ST[idx].rson;
if(pos < mid) modify(pos,x,lson);
else modify(pos,x,rson);
ST[idx].sum = ST[lson].sum + ST[rson].sum;
}
int query(int L,int R,int idx){
if(ST[idx].L == L && ST[idx].R == R){
return ST[idx].sum;
}
int mid = (ST[idx].L + ST[idx].R) / 2;
int lson = ST[idx].lson, rson = ST[idx].rson;
if(R <= mid) return query(L,R,lson);
if(L >= mid) return query(L,R,rson);
return query(L,mid,lson) + query(mid,R,rson);
}
signed main(){
int n,q; cin>>n>>q;
for(int i=0;i<n;i++){
int x; cin>>x;
v.push_back(x);
}
build(0,n,0);
while(q--){
int op,a,b; cin>>op>>a>>b;
if(op == 1){
modify(a-1,b,0);
}
else cout<<query(a-1,b,0)<<"\n";
}
return 0;
}

發佈留言