#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define N 550000
#define R register
#define ll long long
using namespace std;
const int INF=2E9+233;
template<typename T>
inline void read(T &x)
{
x=0;bool f=1;
char c=gc;
while(!isdigit(c)){if(c=='-')f=0;c=gc;}
while(isdigit(c))
x=(x<<1)+(x<<3)+(c-'0'),
c=gc;
x=f?x:-x;
return ;
}
template<typename T>
void write(T x)
{
if(x<0) pc('-'),x=-x;
if(x>9) write(x/10);
pc(x%10+'0');
return ;
}
int n,m,a[N];
struct SegmentTree
{
struct Node
{
int l, r;
int mx, mx_, se, cnt; ll sum;
int add1, add1_, add2, add2_;
}tr[N<<2];
#define lson(x) x<<1
#define rson(x) x<<1|1
void pushup(int rt)
{
tr[rt].sum=tr[lson(rt)].sum+tr[rson(rt)].sum;
tr[rt].mx_=max(tr[lson(rt)].mx_, tr[rson(rt)].mx_);
if (tr[lson(rt)].mx==tr[rson(rt)].mx)
{
tr[rt].mx=tr[lson(rt)].mx;
tr[rt].se=max(tr[lson(rt)].se, tr[rson(rt)].se);
tr[rt].cnt=tr[lson(rt)].cnt+tr[rson(rt)].cnt;
}
else if (tr[lson(rt)].mx>tr[rson(rt)].mx)
{
tr[rt].mx=tr[lson(rt)].mx;
tr[rt].se=max(tr[lson(rt)].se, tr[rson(rt)].mx);
tr[rt].cnt=tr[lson(rt)].cnt;
}
else
{
tr[rt].mx=tr[rson(rt)].mx;
tr[rt].se=max(tr[lson(rt)].mx, tr[rson(rt)].se);
tr[rt].cnt=tr[rson(rt)].cnt;
}
}
void update(int rt, int k1, int k1_, int k2, int k2_)
{
tr[rt].sum+=1ll*k1*tr[rt].cnt+1ll*k2*(tr[rt].r-tr[rt].l+1-tr[rt].cnt);
tr[rt].mx_=max(tr[rt].mx_, tr[rt].mx+k1_);
tr[rt].add1_=max(tr[rt].add1_, tr[rt].add1+k1_);
tr[rt].mx+=k1, tr[rt].add1+=k1;
tr[rt].add2_=max(tr[rt].add2_, tr[rt].add2+k2_);
if (tr[rt].se!=-INF) tr[rt].se+=k2;
tr[rt].add2+=k2;
}
void pushdown(int rt)
{
int tmp=max(tr[lson(rt)].mx, tr[rson(rt)].mx);
if (tr[lson(rt)].mx==tmp)
update(lson(rt), tr[rt].add1, tr[rt].add1_, tr[rt].add2, tr[rt].add2_);
else update(lson(rt), tr[rt].add2, tr[rt].add2_, tr[rt].add2, tr[rt].add2_);
if (tr[rson(rt)].mx==tmp)
update(rson(rt), tr[rt].add1, tr[rt].add1_, tr[rt].add2, tr[rt].add2_);
else update(rson(rt), tr[rt].add2, tr[rt].add2_, tr[rt].add2, tr[rt].add2_);
tr[rt].add1=tr[rt].add1_=tr[rt].add2=tr[rt].add2_=0;
}
void build(int rt, int l, int r)
{
tr[rt].l=l, tr[rt].r=r;
tr[rt].add1=tr[rt].add1_=tr[rt].add2=tr[rt].add2_=0;
if (l==r)
{
tr[rt].sum=tr[rt].mx_=tr[rt].mx=a[l];
tr[rt].se=-INF, tr[rt].cnt=1;
return;
}
int mid=l+r>>1;
build(lson(rt), l, mid);
build(rson(rt), mid+1, r);
pushup(rt);
}
void update_add(int rt, int l, int r, int k)
{
if (tr[rt].l>r||tr[rt].r<l) return;
if (l<=tr[rt].l&&tr[rt].r<=r)
{ update(rt, k, k, k, k); return; }
pushdown(rt);
update_add(lson(rt), l, r, k), update_add(rson(rt), l, r, k);
pushup(rt);
}
void update_min(int rt, int l, int r, int k)
{
if (tr[rt].l>r||tr[rt].r<l||k>=tr[rt].mx) return;
if (l<=tr[rt].l&&tr[rt].r<=r&&k>tr[rt].se)
{ update(rt, k-tr[rt].mx, k-tr[rt].mx, 0, 0); return; }
pushdown(rt);
update_min(lson(rt), l, r, k), update_min(rson(rt), l, r, k);
pushup(rt);
}
ll query_sum(int rt, int l, int r)
{
if (tr[rt].l>r||tr[rt].r<l) return 0;
if (l<=tr[rt].l&&tr[rt].r<=r) return tr[rt].sum;
pushdown(rt);
return query_sum(lson(rt), l, r)+query_sum(rson(rt), l, r);
}
int query_mx(int rt, int l, int r)
{
if (tr[rt].l>r||tr[rt].r<l) return -INF;
if (l<=tr[rt].l&&tr[rt].r<=r) return tr[rt].mx;
pushdown(rt);
return max(query_mx(lson(rt), l, r), query_mx(rson(rt), l, r));
}
int query_mx_(int rt, int l, int r)
{
if (tr[rt].l>r||tr[rt].r<l) return -INF;
if (l<=tr[rt].l&&tr[rt].r<=r) return tr[rt].mx_;
pushdown(rt);
return max(query_mx_(lson(rt), l, r), query_mx_(rson(rt), l, r));
}
#undef lson
#undef rson
} sgt;
int main()
{
read(n),read(m);
for(R int i=1; i<=n; i++)
read(a[i]);
sgt.build(1,1,n);
while (m--)
{
int op,l,r,k;
read(op);read(l);read(r);
if(op==1) read(k),sgt.update_add(1,l,r,k);
if(op==2) read(k),sgt.update_min(1,l,r,k);
if(op==3) write(sgt.query_sum(1,l,r)),pc('\n');
if(op==4) write(sgt.query_mx(1,l,r)),pc('\n');
if(op==5) write(sgt.query_mx_(1,l,r)),pc('\n');
}
return 0;
}
这个是P6242的AC代码
然而加上这句就8TLE:
#define max(a,b) (a>b?a:b)
请问这句话没有原来的max快吗?