第二个样例输出10,求调

P1253 扶苏的问题

违规用户名920406 @ 2024-12-16 20:26:46

本唐诗在今天发了两个线段树求调了(嘻嘻)

悬关

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+1;
int n,m,op,l,r,x,a[N],t[N<<2],tag[N<<2],tag2[N<<2];
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
inline void addtag(int p,int x){
    if(x==9e18)return;
    t[p]=x;
    tag[p]=x;
    tag2[p]=0;
}
inline void addtag2(int p,int x){
    t[p]+=x;
    tag[p]=9e18;
    tag2[p]+=x;
}
inline void push_up(int p){t[p]=max(t[ls(p)],t[rs(p)]);}
inline void push_down(int p,int pl,int pr){
    addtag(ls(p),tag[p]);
    addtag(rs(p),tag[p]);
    tag[p]=9e18;
    addtag2(ls(p),tag2[p]);
    addtag2(rs(p),tag2[p]);
    tag2[p]=0;
}
void bulid(int p,int pl,int pr){
    tag[p]=9e18;
    if(pl==pr){t[p]=a[pl];return;}
    int m=(pl+pr)>>1;
    bulid(ls(p),pl,m);
    bulid(rs(p),m+1,pr);
    push_up(p);
}
void update(int l,int r,int p,int pl,int pr,int x){
    if(l<=pl&&pr<=r){addtag(p,x);return;}
    push_down(p,pl,pr);
    int m=(pl+pr)>>1;
    if(l<=m)update(l,r,ls(p),pl,m,x);
    if(r>m)update(l,r,rs(p),m+1,pr,x);
    push_up(p);
}
void update2(int l,int r,int p,int pl,int pr,int x){
    if(l<=pl&&pr<=r){addtag2(p,x);return;}
    push_down(p,pl,pr);
    int m=(pl+pr)>>1;
    if(l<=m)update2(l,r,ls(p),pl,m,x);
    if(r>m)update2(l,r,rs(p),m+1,pr,x);
    push_up(p);
}
int query(int l,int r,int p,int pl,int pr){
    if(l<=pl&&pr<=r)return t[p];
    push_down(p,pl,pr);
    int m=(pl+pr)>>1,an=-9e18;
    if(l<=m)an=max(an,query(l,r,ls(p),pl,m));
    if(r>m)an=max(an,query(l,r,rs(p),m+1,pr));
    return an;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)   cin>>a[i];
    bulid(1,1,n);
    while(m--){
        cin>>op>>l>>r;
        if(op==1){
            cin>>x;
            update(l,r,1,1,n,x);
        }else if(op==2){
            cin>>x;
            update2(l,r,1,1,n,x);
        }else cout<<query(l,r,1,1,n)<<'\n';
    }
    return 0;
}

|