50pts球跳,悬5关
查看原帖
50pts球跳,悬5关
671415
The_End_of_GCC楼主2025/8/1 14:09
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define fa tree[k]
#define ls tree[k<<1]
#define rs tree[k<<1|1]
const  int N=1e6;
const int inf=1145141919810;
int n,q;
int a[4*N+5];
struct node
{
    int l,r;
    int maxx;
    int adtag,chtag;
}tree[4*N+5];
void push_down(int k)
{
    int tag;
    if(fa.chtag!=-inf)
    {
        tag=fa.chtag;
        ls.adtag=rs.adtag=0;
        ls.maxx=rs.maxx=tag;
        ls.chtag=rs.chtag=tag;
        fa.chtag=-inf;
    }
    tag=fa.adtag;
    ls.adtag+=tag;
    rs.adtag+=tag;
    ls.maxx+=tag;
    rs.maxx+=tag;
    fa.adtag=0;
    return ;
}
void build(int k,int l,int r)
{
    fa.l=l,fa.r=r;
    fa.adtag=0,fa.chtag=-inf;
    if(l==r)
    {
        fa.maxx=a[l];
        return ;
    }
    int mid=(fa.l+fa.r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    fa.maxx=max(ls.maxx,rs.maxx);
    return ;
}
void add(int k,int l,int r,int x)
{
    if(fa.l>=l && fa.r<=r)
    {
        fa.adtag+=x;
        fa.maxx+=x;
        return ;
    }
    push_down(k);
    int mid=(fa.l+fa.r)>>1;
    if(mid>=l)
        add(k<<1,l,r,x);
    if(mid+1<=r)
        add(k<<1|1,l,r,x);
    fa.maxx=max(ls.maxx,rs.maxx);
    return ;
}
void change(int k,int l,int r,int x)
{
    if(fa.l>=l && fa.r<=r)
    {
        fa.chtag=x;
        fa.maxx=x;
        fa.adtag=0;
        return ;
    }
    push_down(k);
    int mid=(fa.l+fa.r)>>1;
    if(mid>=l)
        change(k<<1,l,r,x);
    if(mid+1<=r)
        change(k<<1|1,l,r,x);
    fa.maxx=max(ls.maxx,rs.maxx);
    return ;
}
int ask(int k,int l,int r)
{
    int ans=0;
    if(fa.l>=l && fa.r<=r)
        return fa.maxx;
    push_down(k);
    int mid=(fa.l+fa.r)>>1;
    if(mid>=l)
        ans=max(ans,ask(k<<1,l,r));
    if(mid+1<=r)
        ans=max(ans,ask(k<<1|1,l,r));
//    fa.maxx=max(ls.maxx,rs.maxx);
    return ans;
}
signed main()
{
//	freopen("P1253_6 (1).in","r",stdin);
//	freopen("my.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,1,n);
    while(q--)
    {
        int op,x,y,z;
        cin>>op>>x>>y;
        if(op==1)
        {
            cin>>z;
            change(1,x,y,z);
        }
        if(op==2)
        {
            cin>>z;
            add(1,x,y,z);
        }
        if(op==3)
        {
            cout<<ask(1,x,y)<<"\n";
        }
    }
    return 0;
}
2025/8/1 14:09
加载中...