线段树求调
查看原帖
线段树求调
902702
wuming1679a楼主2024/6/8 18:29

T1 AC
其余全WA

#include<bits/stdc++.h>
#define left idx<<1
#define right idx<<1|1
#define int long long
using namespace std;
const int N=5e5+5;
long long a[N];
long long value[N*4],lazy[N*4];
void push_down(int idx,int l,int r){
    if(lazy[idx]){
        lazy[left]+=lazy[idx];
        lazy[right]+=lazy[idx];
        int mid=l+r>>1;
        value[left]+=(mid-l+1)*lazy[idx];
        value[right]+=(r-mid+1)*lazy[idx];
        lazy[idx]=0;
    }
}
void build(int idx,int l,int r){
    if(l==r){
        value[idx]=a[l];
        return;
    }
    int mid=l+r>>1;
    build(left,l,mid);
    build(right,mid+1,r);
    value[idx]=value[left]+value[right];
}
void modify(int idx,int l,int r,int ql,int qr,int val){
    if(ql<=l&&r<=qr){
        lazy[idx]+=val;
        value[idx]+=(r-l+1)*val;
        return;
    }
    push_down(idx,l,r);

    int mid=l+r>>1;
    if(ql<=mid)modify(left,l,mid,ql,qr,val);
    if(qr>mid)modify(right,mid+1,r,ql,qr,val);

    value[idx]=value[left]+value[right];
}
long long query(int idx,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)
        return value[idx];
    push_down(idx,l,r);

    long long ans=0;

    int mid=l+r>>1;
    if(ql<=mid)ans+=query(left,l,mid,ql,qr);
    if(qr>mid)ans+=query(right,mid+1,r,ql,qr);

    return ans;
}
signed main(){
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    
    build(1,1,n);
//    for(int i=1;i<=n*4;i++)cout<<value[i]<<" ";cout<<endl;
    while(m--){
        int op,l,r,val;
        cin>>op;
        if(op==1){
            int x,y,val;cin>>x>>y>>val;
            modify(1,1,n,x,y,val);
//            for(int i=1;i<=n*4;i++)cout<<value[i]<<" ";cout<<endl;
			}
        else{
        	int x;cin>>x;
            cout<<query(1,1,n,x,x)<<endl;
        }
    }
    
    return 0;
}
2024/6/8 18:29
加载中...