线段树过不去样例求条qwq
查看原帖
线段树过不去样例求条qwq
1071426
shx2011楼主2025/1/21 21:26

初学线段树的萌新疑惑中qwq

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int tree[4*N],a[N],add[4*N];
void build(int l,int r,int k){
    if(l==r){
        tree[k]=a[l];
        return;
    }

    int mid=l+r>>1;
    build(l,mid,2*k);
    build(mid+1,r,2*k+1);
    tree[k]=tree[k*2]+tree[2*k+1];
}

void change(int l,int r,int k,int v){
    tree[k]+=v*(r-l+1);
    add[k]+=v;
}

void down(int l,int r,int k){
    if(add[k]!=0){
        int mid=l+r>>1;
        change(l,mid,2*k,add[k]);
        change(mid+1,r,2*k+1,add[k]);
        add[k]=0;
    }

}

void update(int l,int r,int k,int x,int y,int v){
    if(x<=l && y>=r){
        change(l,r,k,v);
        return;
    }
    down(l,r,k);
    int mid=l+r>>1;
    if(x<=mid) update(l,mid,2*k,x,y,v);
    if(y>mid) update(mid+1,r,2*k+1,x,y,v);
    tree[k]=tree[2*k]+tree[2*k+1];
}

int quary(int l,int r,int k,int x,int y){
    if(l<=x && r<=y){
        return tree[k];
    }

    down(l,r,k);
    int mid=l+r>>1;
    int res=0;
    if(x<=mid) res+=quary(l,mid,k*2,x,y);
    if(y>mid) res+=quary(mid+1,r,k*2+1,x,y);
    return res;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    while(m--){
        int p;
        cin>>p;
        if(p==1){
            int x,y,k;
            cin>>x>>y>>k;
            update(1,n,1,x,y,k);
        }else{
            int x;
            cin>>x;
            cout<<quary(1,n,1,x,x)<<"\n";
        }
    }
    return 0;
}

2025/1/21 21:26
加载中...