HDU 5306 求助RE
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int a[N],sum[N<<2],mx[N<<2],se[N<<2],cnt[N<<2];
void pushup(int p)
{
int ls=p<<1,rs=p<<1|1;
sum[p]=sum[ls]+sum[rs];
mx[p]=max(mx[ls],mx[rs]);
if(mx[ls]==mx[rs])
{
se[p]=max(se[ls],se[rs]);
cnt[p]=cnt[p<<1]+cnt[p<<1|1];
}
else
{
se[p]=max({se[ls],se[rs],min(mx[ls],mx[rs])});
cnt[p]=mx[ls]>mx[rs]?cnt[ls]:cnt[rs];
}
}
void build(int p,int pl,int pr)
{
if(pl==pr)
{
mx[p]=sum[p]=a[pl];
se[p]=-1;
cnt[p]=1;
return ;
}
int mid=(pl+pr)>>1;
build(p<<1,pl,mid);
build(p<<1|1,mid+1,pr);
pushup(p);
}
void addtag(int p,int d)
{
if(d>=mx[p])
return ;
sum[p]-=cnt[p]*(mx[p]-d);
mx[p]=d;
}
void pushdown(int p)
{
addtag(p<<1,mx[p]);
addtag(p<<1|1,mx[p]);
}
void update(int p,int pl,int pr,int L,int R,int d)
{
if(d>=mx[p])
return ;
if(L<=pl&&pr<=R&&se[p]<d)
{
addtag(p,d);
return ;
}
int mid=(pl+pr)>>1;
pushdown(p);
update(p<<1,pl,mid,L,R,d);
update(p<<1|1,mid+1,pr,L,R,d);
pushup(p);
}
int qsum(int p,int pl,int pr,int L,int R)
{
if(L<=pl&&pr<=R)
return sum[p];
pushdown(p);
int mid=(pl+pr)>>1;
if(R<mid)
return qsum(p<<1,pl,mid,L,R);
if(L>mid)
return qsum(p<<1,pl,mid,L,R);
return qsum(p<<1,pl,mid,L,R)+qsum(p<<1,pl,mid,L,R);
}
int qmax(int p,int pl,int pr,int L,int R)
{
if(L<=pl&&pr<=R)
return mx[p];
int mid=(pl+pr)>>1;
pushdown(p);
if(R<mid)
return qmax(p<<1,pl,mid,L,R);
if(L>mid)
return qmax(p<<1,pl,mid,L,R);
return max(qsum(p<<1,pl,mid,L,R),qsum(p<<1,pl,mid,L,R));
}
void solve()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
build(1,1,n);
while(m--)
{
int op,x,y,k;
cin>>op>>x>>y;++op;
if(op==1)
{
cin>>k;
update(1,1,n,x,y,k);
}
if(op==3)
cout<<qsum(1,1,n,x,y)<<'\n';
if(op==2)
cout<<qmax(1,1,n,x,y)<<'\n';
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);