线段树(第一次,初学),求调
查看原帖
线段树(第一次,初学),求调
1271310
mysb楼主2024/10/24 14:52
#include<bits/stdc++.h>
#define lowbit(x) x&(-x)
#define int long long
using namespace std;
int n,m;
int num[10000005];
struct mode{
	int l,r,v;
}a[40000005];
void build(int id,int l,int r){
	a[id].l=l;
	a[id].r=r;
	if(l==r){
		a[id].v=num[l];
		return;
	}
	int mid=l+r>>1;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	a[id].v=a[id*2].v+a[id*2+1].v;
	return;
}
void up(int id,int k,int v){
	int l=a[id].l;
	int r=a[id].r;
	if(l==r){
		a[id].v=v;
		return;
	}
	int mid=l+r>>1;
	if(mid>k)up(id*2,k,v);
	else if(mid<k)up(id*2+1,k,v);
	a[id].v=a[id*2].v+a[id*2+1].v;
	return;
}
int ask(int id,int tgl,int tgr){
	int l=a[id].l;
	int r=a[id].r;
	if(tgl<=l&&r<=tgr)return a[id].v;
	int mid=l+r>>1;
	if(tgr<=mid)return ask(id*2,tgl,tgr);
	else if(tgl>=mid)return ask(id*2+1,tgl,tgr);
	return ask(id*2,tgl,tgr)+ask(id*2+1,tgl,tgr);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>num[i];
build(1,1,n);
while(m--){
	int o,x,y;
	cin>>o>>x>>y;
	if(o==1){
		up(1,x,y);
	}
	else{
	int k=ask(1,x,y);
		cout<<k<<"\n";
	}
}
	return 0;
} 
2024/10/24 14:52
加载中...