申请加强数据
查看原帖
申请加强数据
1079515
suPerG00d楼主2025/7/25 11:32

代码连样例都没过但是AC

#include <bits/stdc++.h>
using namespace std;
int n,q;
int a[1000010];
struct node{
    int l,r,v,t;
}f[4000010];
inline void pushdown(int i){
    if (f[i].t>0){
        f[i*2].t+=f[i].t;
        f[i*2+1].t+=f[i].t;
        f[i*2].v+=f[i].t*(f[i*2].r-f[i*2].l+1);
        f[i*2+1].v+=f[i].t*(f[i*2+1].r-f[i*2+1].l+1);
        f[i].t=0;
    }
}
inline void pushup(int i){
    f[i].v=f[i*2].v+f[i*2+1].v;
}
void build(int i,int l,int r){
    f[i].l=l;
    f[i].r=r;
    if (l==r){
        f[i].v=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(i*2,l,mid);
    build(i*2+1,mid+1,r);
    f[i].v=f[i*2].v+f[i*2+1].v;
}
void update(int i,int l,int r,int x){
    if (f[i].r<l || r<f[i].l){
        return;
    }
    if (l<=f[i].l && f[i].r<=r){
        f[i].v+=(f[i].r-f[i].l+1)*x;
        f[i].t+=x;
        return ;
    }
    pushdown(i);
    if (l<=f[i*2].r) update(i*2,l,r,x);
    if (f[i*2+1].l<=r) update(i*2+1,l,r,x);
    pushup(i);
}
int get(int i,int l,int r){
    if (l>r) swap(l,r);
    if (f[i].r<l || r<f[i].l){
        return 0;
    }
    if (l<=f[i].l && f[i].r<=r){
        return f[i].v;
    }
    pushdown(i);
    return get(i*2,l,r)+get(i*2+1,l,r);
}
int main(){
    int n,q;
    scanf("%d%d",&n,&q);
    for (int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    while(q--){
        int c;
        scanf("%d",&c);
        if (c==1){
            int x,y,k;
            scanf("%d %d %d",&x,&y,&k);
            update(1,x,y,k);
        }
        else{
            int p;
            scanf("%d",&p);
            printf("%d\n",get(1,p,p));
        }
    }
    
    return 0;
}
2025/7/25 11:32
加载中...