社区讨论

线段树0pts求调玄关

P3374【模板】树状数组 1参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mih9xavj
此快照首次捕获于
2025/11/27 18:11
3 个月前
此快照最后确认于
2025/11/28 20:30
3 个月前
查看原帖
代码如下
学艺不精,区间修改秒切,但单点修改卡两天
CPP
#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 条回复,欢迎继续交流。

正在加载回复...