MLE玄关求调
查看原帖
MLE玄关求调
1120455
wudihuoyingdawang楼主2025/1/21 20:40

MLE求调

#include <bits/stdc++.h>
using namespace std;
int n,f,a[200003],tree[800003],tag[800003],l,r,d,x;
int ls(int x){return 2*x;}
int rs(int x){return 2*x+1;}
void pushup(int p){
    tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(int p,int l,int r){
    tag[p]=0;
    if(l==r) tree[p]=a[l];
    else{
        int mid=((r-l)>>1)+l;
        build(ls(p),l,mid);
        build(rs(p),mid+1,r);
        pushup(p);
    }
}
void addtag(int p,int l,int r,int d){
    tag[p]+=d;
    tree[p]+=d*(r-l+1);
}
void pushdown(int p,int l,int r){
    if(tag[p]){
        int mid=((r-l)>>1)+l;
        addtag(ls(p),l,mid,tag[p]);
        addtag(rs(p),mid+1,r,tag[p]);
        tag[p]=0;
    }
}
void gai(int p,int l,int r,int L,int R,int d){
    if(L<=l&&r<=R){addtag(p,l,r,d);return;}
    pushdown(p,l,r);
    int mid=((r-l)>>1)+l;
    if(mid>=L) gai(ls(p),l,mid,L,R,d);
    if(mid<R) gai(rs(p),mid+1,r,L,R,d);   
    pushup(p);
}
int query(int p,int l,int r,int L,int R){
    if(L<=l&&r<=R) return tree[p];
    int mid=((r-l)>>1)+l,ans=0;
    if(mid>=L) ans+=query(ls(p),l,mid,L,R);
    if(mid<r) ans+=query(rs(p),mid+1,r,L,R);
    return ans;
}
int main(){
    scanf("%d%d",&n,&f);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    for(int i=1;i<=f;i++){
        scanf("%d",&x);
        if(x==1){
            scanf("%d%d%d",&l,&r,&d);
            gai(1,1,n,l,r,d);
            if(l==1) a[1]+=d;
        }
        else if(x==2){
            scanf("%d",&d);
            gai(1,1,n,1,1,d);
            a[1]+=d;
        }
        else if(x==3){
            scanf("%d",&d);
            gai(1,1,n,1,1,-d);
            a[1]-=d;
        }
        else if(x==4){
            scanf("%d%d",&l,&r);
            printf("%d\n",query(1,1,n,l,r));
        }
        else printf("%d\n",a[1]);
    }
    return 0;
}
2025/1/21 20:40
加载中...