10pts求调

P1253 扶苏的问题

Pangding @ 2024-02-20 16:49:31

#include<bits/stdc++.h>
#define int long long
using namespace std;

int a[100010];

struct tree {
    int value;
    int lazytag,lazytag2;//tag2直接修改;
    int havecover;
    int l,r;
} tree[500010];

void pushdown(int k) {
    int mid=(tree[k].l+tree[k].r)>>1;
    if(!tree[k].havecover){
        tree[k*2].value+=tree[k].lazytag,tree[k*2+1].value+=tree[k].lazytag;
        if(tree[k*2].havecover){
            tree[k*2].lazytag2+=tree[k].lazytag;
            tree[k*2].lazytag+=tree[k].lazytag; 
        }
        if(tree[k*2+1].havecover){
            tree[k*2+1].lazytag2+=tree[k].lazytag;
            tree[k*2+1].lazytag+=tree[k].lazytag;   
        }
    }
    if(tree[k].havecover){
        tree[k*2].value=tree[k*2+1].value=tree[k].lazytag2;
        tree[k*2].havecover=tree[k*2+1].havecover=1;
        tree[k*2].lazytag2=tree[k*2+1].lazytag2=tree[k].lazytag2;
        tree[k*2].lazytag=tree[k*2+1].lazytag=0;
    }
    tree[k].lazytag=0;
    tree[k].havecover=0;
    tree[k].lazytag2=0;
}

void build(int k,int l,int r) {
    tree[k].l=l;
    tree[k].r=r;
    if(l==r) {
        tree[k].value=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    tree[k].value=max(tree[k*2].value,tree[k*2+1].value);
}

void update(int k,int l,int r,int v) {
    if(tree[k].l==l&&tree[k].r==r) {
        tree[k].value+=v;
        tree[k].lazytag+=v;
        if(tree[k].havecover)
            tree[k].lazytag2+=v;
        return;
    }
    pushdown(k);
    int mid=(tree[k].l+tree[k].r)>>1;
    if(r<=mid) {
        update(k*2,l,r,v);
    } else if(l>mid) {
        update(k*2+1,l,r,v);
    } else {
        update(k*2,l,mid,v);
        update(k*2+1,mid+1,r,v);
    }
    tree[k].value=max(tree[k*2].value,tree[k*2+1].value);
}

void update2(int k,int l,int r,int v) {
    if(tree[k].l==l&&tree[k].r==r) {
        tree[k].value=v;
        tree[k].lazytag=0;
        tree[k].lazytag2=v;
        tree[k].havecover=1;
        return;
    }
    pushdown(k);
    int mid=(tree[k].l+tree[k].r)>>1;
    if(r<=mid) {
        update(k*2,l,r,v);
    } else if(l>mid) {
        update(k*2+1,l,r,v);
    } else {
        update(k*2,l,mid,v);
        update(k*2+1,mid+1,r,v);
    }
    tree[k].value=max(tree[k*2].value,tree[k*2+1].value);
}

int query(int k,int l,int r) {
    if(l==tree[k].l&&r==tree[k].r) {
        return tree[k].value;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    pushdown(k);
    if(r<=mid) {
        return query(k*2,l,r);
    } else if(l>mid) {
        return query(k*2+1,l,r);
    } else {
        return query(k*2,l,mid)+query(k*2+1,mid+1,r);
    }
}

signed main() {
    int n,m;
    cin>>n>>m;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
    }
    build(1,1,n);
    while(m--) {
        int a,b,c,d;
        cin>>a>>b>>c;
        if(a==1) {
            cin>>d;
            update2(1,b,c,d);
        } else {
            if(a==2) {
                cin>>d;
                update(1,b,c,d);
            } else {
                cout<<query(1,b,c);
            }
        }
    }
    return 0;
}

|