妹子刚学OI 50pts求调
查看原帖
妹子刚学OI 50pts求调
622631
u_lcp楼主2024/4/25 19:17
#include <bits/stdc++.h>
#define pc putchar(' ')
#define pe putchar('\n')
using namespace std;
template<typename T>void read(T& n)
{
    T f=1,k=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-'){f=-1;}c=getchar();}
    while(c<='9'&&c>='0'){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
    n=f*k;
}
template<typename T>void write(T x)
{
    if(x==0){putchar('0');return;}
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
const int maxn=1e6+10;
#define ls rt<<1
#define rs rt<<1|1
#define mid ((l+r)>>1)
typedef long long ll;
struct sgt
{
    int l,r;
    bool isfill;
    int lzyfill,lzyadd;
    ll mx;
}t[maxn<<2];
ll a[maxn];
int n,q;
void pushup(int rt)
{
    t[rt].mx=max(t[ls].mx,t[rs].mx);
}
void build(int rt,int l,int r)
{
    t[rt].l=l;
    t[rt].r=r;
    t[rt].isfill=false;
    t[rt].lzyadd=0;
    t[rt].lzyfill=0;
    if(l==r)
    {
        t[rt].mx=a[l];
        return;
    }
    build(ls,l    ,mid);
    build(rs,mid+1,r  );
    pushup(rt);
}
void makelzyfill(int rt,ll x)
{
    t[rt].isfill=true;
    t[rt].lzyfill=x;
    t[rt].lzyadd=0;
    t[rt].mx=x;
}
void makelzyadd(int rt,ll x)
{
    t[rt].mx+=x;
    t[rt].lzyadd+=x;
}
void pushdown(int rt)
{
    if(t[rt].isfill)
    {
        makelzyfill(ls,t[rt].lzyfill);
        makelzyfill(rs,t[rt].lzyfill);
        t[rt].isfill=false;
        t[rt].lzyfill=0;
    }
    if(t[rt].lzyadd)
    {
        makelzyadd(ls,t[rt].lzyadd);
        makelzyadd(rs,t[rt].lzyadd);
        t[rt].lzyadd=0;
    }
}
void cover(int rt,int ql,int qr,ll x)
{
    int l=t[rt].l,r=t[rt].r;
    if(ql<=l&&r<=qr)
    {
        makelzyfill(rt,x);
        return;
    }
    pushdown(rt);
    if(ql<=mid)cover(ls,ql,qr,x);
    if(qr>mid) cover(rs,ql,qr,x);
    pushup(rt);
}
void update(int rt,int ql,int qr,ll x)
{
    int l=t[rt].l,r=t[rt].r;
    if(ql<=l&&r<=qr)
    {
        makelzyadd(rt,x);
        return;
    }
    pushdown(rt);
    if(ql<=mid)update(ls,ql,qr,x);
    if(qr>mid) update(rs,ql,qr,x);
    pushup(rt);    
}
ll query(int rt,int ql,int qr)
{
    int l=t[rt].l,r=t[rt].r;
    if(ql<=l&&r<=qr)
    {
        return t[rt].mx;
    }
    pushdown(rt);
    ll ans=-2e9;
    if(ql<=mid)ans=max(ans,query(ls,ql,qr));
    if(qr>mid) ans=max(ans,query(rs,ql,qr));
    return ans;
}
int main()
{
    read(n),read(q);
    for(int i=1;i<=n;i++)read(a[i]);
    build(1,1,n);
    for(int i=1;i<=q;i++)
    {
        int o,l,r;ll x;
        read(o),read(l),read(r);
        if(o==1)read(x),cover(1,l,r,x);
        else if(o==2)read(x),update(1,l,r,x);
        else write(query(1,l,r)),pe;
    }
    return 0;
}
2024/4/25 19:17
加载中...