#10 RE但是开八倍空间就AC
查看原帖
#10 RE但是开八倍空间就AC
773503
Falling_Sakura楼主2023/7/25 19:49
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1000;
#define int long long
typedef long long ll;
struct node
{
    int l,r;
    int max;
    ll add,add2=-2147488888883647;
}tr[N<<2];
int n,q;
int a[N];
inline int read()
{
	int x=0,y=1;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-') y=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*y;
}
void pushup(int u)
{
    tr[u].max=max(tr[u<<1].max,tr[u<<1|1].max);
}
void pushdown2(int u)
{
    if(tr[u].add2!=-2147488888883647)
    {
        tr[u<<1].max=tr[u].add2;
        tr[u<<1].add2=tr[u].add2;
        tr[u<<1|1].max=tr[u].add2;
        tr[u<<1|1].add2=tr[u].add2;
        tr[u<<1].add=tr[u<<1|1].add=0;
        tr[u].add2=-2147488888883647;
    }
}
void pushdown(int u)
{
    if(tr[u].add)
    {
        pushdown2(u);//先覆盖后加
        tr[u<<1].add+=tr[u].add;
        tr[u<<1|1].add+=tr[u].add;
        tr[u<<1].max+=tr[u].add;
        tr[u<<1|1].max+=tr[u].add;
        tr[u].add=0;
    }
}
void build(int u,int l,int r)
{
    tr[u].l=l,tr[u].r=r;
    if(l==r)
    {
        tr[u].max=a[r];
        tr[u].add=0;
        tr[u].add2=-2147488888883647;
    }
    else
    {
        int mid=(l+r)>>1;
        build(u<<1,l,mid);
        build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
void modify_add(int u,int l,int r,int x)
{
    if(tr[u].l>=l&&tr[u].r<=r)
    {
        pushdown2(u);//添加前先覆盖
        tr[u].max+=x;
        tr[u].add+=x;
    }
    else
    {
        pushdown2(u);
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid) modify_add(u<<1,l,r,x);
        if(r>mid) modify_add(u<<1|1,l,r,x);
        pushup(u);
    }
}
void modify(int u,int l,int r,int x)
{
    if(tr[u].l>=l&&tr[u].r<=r)
    {
        tr[u].add=0;
        tr[u].max=x;
        tr[u].add2=x;
    }
    else
    {
        pushdown2(u);
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid) modify(u<<1,l,r,x);
        if(r>mid) modify(u<<1|1,l,r,x);
        pushup(u);
    }
}
int query(int u,int l,int r)
{
    if(tr[u].l>=l&&tr[u].r<=r) return tr[u].max;
    else
    {
        int maxn=-0x3fffffffff;
        pushdown2(u);
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid) maxn=max(maxn,query(u<<1,l,r));
        if(r>mid) maxn=max(maxn,query(u<<1|1,l,r));
        return maxn;
    }
}
signed main()
{
    n=read(),q=read();
    for(int i=1;i<=n;i++)
    {
        a[i]=read();
    }
    for(int i=1;i<=4*n;i++)
        tr[i].add2=-2147488888883647;
    build(1,1,n);
    int op,l,r,x;
    while(q--)
    {
        op=read();
        l=read();
        r=read();
        if(op==1)
        {
            x=read();
            modify(1,l,r,x);
        }
        else if(op==2)
        {
            x=read();
            modify_add(1,l,r,x);
        }
        else
        {
            printf("%lld\n",query(1,l,r));
        }
    }
    return 0;
}
2023/7/25 19:49
加载中...