线段树60分求调
查看原帖
线段树60分求调
372780
Starw楼主2023/7/2 10:59

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define M 1000005
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int t[M<<2],rt1[M<<2],rt2[M<<2];
int vis[M<<2];
inline void pushup(int x){
    t[x]=max(t[ls(x)],t[rs(x)]);
}
inline void push_down(int p){
    // cout<<l<<' '<<r<<' '<<t[p]<<' '<<rt1[p]<<' '<<rt2[p]<<"^\n";
    if(vis[p]){
        t[ls(p)]=rt2[p];
        rt2[ls(p)]=rt2[p];
        t[rs(p)]=rt2[p];
        rt2[rs(p)]=rt2[p];
        vis[rs(p)]=vis[ls(p)]=1;
        rt2[p]=0;   
        vis[p]=0;
        rt1[rs(p)]=rt2[ls(p)]=0;
    }
    t[ls(p)]+=rt1[p];
    rt1[ls(p)]+=rt1[p];
    t[rs(p)]+=rt1[p];
    rt1[rs(p)]+=rt1[p];
    rt1[p]=0;

}
inline void build(int p,int l,int r){
    t[p]=-1e18;
    if(l==r){
        scanf("%lld",&t[p]);
        // cout<<t[p]<<";\n";
        // cout<<l<<' '<<r<<' '<<t[p]<<'-'<<p<<"+\n";        
        return;
    }
    int mid=((l+r)>>1);
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    pushup(p);
    // cout<<l<<' '<<r<<' '<<t[p]<<' '<<t[ls(p)]<<' '<<t[rs(p)]<<"P\n";

}
inline int qry(int l,int r,int x,int y,int p){
    int maxn=-1e16;
    if((l<=x&&y<=r)||vis[p]){
        // cout<<x<<' '<<y<<' '<<t[p]<<")\n";
        return t[p];
    }
    push_down(p);
    int mid=((x+y)>>1);
    if(l<=mid)maxn=max(maxn,qry(l,r,x,mid,ls(p)));
    if(r>mid)maxn=max(maxn,qry(l,r,mid+1,y,rs(p)));
    pushup(p);
    // cout<<maxn<<"l\n";
    return maxn;
}
inline void add(int l,int r,int k,int x,int y,int p){
    if(l<=x&&y<=r){
        // cout<<x<<' '<<y<<' '<<t[p]<<' '<<p<<"=\n";
        t[p]+=k;
        if(vis[p])rt2[p]+=k;
        else rt1[p]+=k;
        // cout<<x<<' '<<y<<' '<<t[p]<<"*\n";
        return;
    }
    push_down(p);
    int mid=((x+y)>>1);
    if(l<=mid)add(l,r,k,x,mid,ls(p));
    if(r>mid)add(l,r,k,mid+1,y,rs(p));
    pushup(p);   
}
inline void ass(int l,int r,int k,int x,int y,int p){
    if(l<=x&&y<=r){   
        t[p]=k,rt2[p]=k,vis[p]=1;
        rt1[p]=0;
        // cout<<x<<' '<<y<<' '<<t[p]<<"!\n";  
        return;
    }
    push_down(p);
    int mid=((x+y)>>1);
    if(l<=mid)ass(l,r,k,x,mid,ls(p));
    if(r>mid)ass(l,r,k,mid+1,y,rs(p));
    pushup(p);
}
signed main(){
    int n,m;
    scanf("%lld%lld",&n,&m);
    build(1,1,n);
    while(m--){
        int op,l,r,x;
        scanf("%lld%lld%lld",&op,&l,&r);
        if(l>r)l^=r,r^=l,l^=r;
        if(op==1){
            scanf("%lld",&x);
            ass(l,r,x,1,n,1);
        }else
        if(op==2){
            scanf("%lld",&x);
            add(l,r,x,1,n,1);
        }else       
        if(op==3)printf("%lld\n",qry(l,r,1,n,1));
    }
    return 0;
}
2023/7/2 10:59
加载中...