求调
查看原帖
求调
322792
Alea楼主2022/10/20 22:42
#include <iostream>
#define size 100001
using namespace std;
int n,iv[size],seg[size];
void build(int b,int e,int o){
    if(b==e) seg[o]=iv[b];
    else{
        int m=b+(e-b)/2;
        build(b,m,o*2),build(m+1,e,o*2+1);
        seg[o]=seg[o*2]+seg[o*2+1];
    }
}
void change(int l,int r,int c,int b,int e,int o){
    if(b>=l&&e<=r) seg[o]+=c;
    else{
        int m=b+(e-b)/2;
        if(l<=m) change(l,r,c,b,m,o*2);
        if(r>=m+1) change(l,r,c,m+1,e,o*2+1);
    }
}
int rangesum(int l,int r,int b,int e,int o){
    if(l<=b&&e<=r) return seg[o];
    else{
        int m=b+(e-b)/2,ret=0;
        if(m>=l) ret+=rangesum(l,r,b,m,o*2);
        if(m+1<=r) ret+=rangesum(l,r,m+1,e,o*2+1);
        return ret;
    }
}
void getpoint(int p,int &r,int b,int e,int o){
    if(b==e) r+=seg[o];
    else{
        int m=b+(e-b)/2;
        if(p<=m) getpoint(p,r,b,m,o*2);
        else getpoint(p,r,m+1,e,o*2+1);
    }
}
int main(){
    ios::sync_with_stdio(false);
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>iv[i];
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int op;
        cin>>op;
        if(op==1){
            int x,y,k;
            cin>>x>>y>>k;
            change(x,y,k,1,n,1);
        }else if(op==2){
            int x,y,ans=0;
            cin>>x>>y;
            for(int i=x;i<=y;i++) getpoint(i,ans,1,n,1);
            cout<<ans<<endl;
        }
    }
    return 0;
}

在样例输入的情况下,最后一个数输出的是16

求大佬调试

2022/10/20 22:42
加载中...