社区讨论
线段树0pts求调玄关
P3374【模板】树状数组 1参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mih9xavj
- 此快照首次捕获于
- 2025/11/27 18:11 3 个月前
- 此快照最后确认于
- 2025/11/28 20:30 3 个月前
代码如下
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=5e5+10;
int n,m,a[N];
struct Q{
int sum,l,r;
}tree[N<<2];
inline void build(int l,int r,int i){
tree[i].l=l,tree[i].r=r;
if(l==r){
tree[i].sum=a[l];
return;
}int mid=(l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
tree[i].sum=tree[i<<1].sum+tree[i<<1+1].sum;
}inline void change(int i,int x,int k){
if(tree[i].l==tree[i].r){
tree[i].sum+=k;
return;
}
if(tree[i].r>=x) change(i<<1,x,k);
else change(i<<1|1,x,k);
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}inline int ask(int l,int r,int i){
if(l<=tree[i].l&&r>=tree[i].r)
return tree[i].sum;
int ans=0,mid=(tree[i].l+tree[i].r)>>1;
if(l<=mid) ans+=ask(l,r,i<<1);
if(r>mid) ans+=ask(l,r,i<<1|1);
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
while(m--){
char c;
int x,y;
cin>>c>>x>>y;
if(c=='1')
change(1,x,y);
else
cout<<ask(x,y,1)<<endl;
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...