写了半天线段树TLE(2),为什么看了下提交似乎都是开O2过的,当然也有可能是我没看到
所以有不用O2的,如果方便,帮我看看怎么改过
#include<bits/stdc++.h>
using namespace std;
const int N=5*1e5+10;
const int INF=2e9;
struct Yan
{
int l,r;
int maxt;
int atg,ntg,xtg;
}tr[N*4];
int w[N];
int n,m;
void moveadd(Yan &u,int s)
{
u.maxt+=s;
u.atg+=s;
u.xtg+=s;
u.ntg+=s;
}
void movenul(Yan &u,int s)
{
u.maxt=min(u.maxt,s);
u.xtg=min(u.xtg,s);
u.ntg=min(u.ntg,s);
}
void movex(Yan &u,int s)
{
u.maxt=max(u.maxt,s);
u.xtg=max(u.xtg,s);
}
void pushup(Yan &u,Yan &l,Yan &r)
{
u.maxt=max(l.maxt,r.maxt);
}
void pushdown(Yan &u,Yan &l,Yan &r)
{
moveadd(l,u.atg);moveadd(r,u.atg); u.atg=0;
movenul(l,u.ntg);movenul(r,u.ntg); u.ntg=INF;
movex(l,u.xtg);movex(r,u.xtg); u.xtg=-INF;
}
void pushdown(int u)
{
pushdown(tr[u],tr[u<<1],tr[u<<1|1]);
}
void pushup(int u)
{
pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}
void build(int u,int l,int r)
{
tr[u].l=l,tr[u].r=r;
tr[u].ntg=INF,tr[u].xtg=-INF;
if(l==r)
{
tr[u].maxt=w[r];
}
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 v)
{
if(tr[u].l>=l&&tr[u].r<=r) moveadd(tr[u],v);
else
{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(mid>=l) modify_add(u<<1,l,r,v);
if(mid<r) modify_add(u<<1|1,l,r,v);
pushup(u);
}
}
void modify_ntg(int u,int l,int r,int v)
{
if(tr[u].l>=l&&tr[u].r<=r) movenul(tr[u],v);
else
{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(mid>=l) modify_ntg(u<<1,l,r,v);
if(mid<r) modify_ntg(u<<1|1,l,r,v);
pushup(u);
}
}
void modify_xtg(int u,int l,int r,int v)
{
if(tr[u].l>=l&&tr[u].r<=r) movex(tr[u],v);
else
{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(mid>=l) modify_xtg(u<<1,l,r,v);
if(mid<r) modify_xtg(u<<1|1,l,r,v);
pushup(u);
}
}
Yan query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r) return tr[u];
else
{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(mid>=r) return query(u<<1,l,r);
else if(mid<l) return query(u<<1|1,l,r);
else
{
Yan res,res1,res2;
res1=query(u<<1,l,r);
res2=query(u<<1|1,l,r);
pushup(res,res1,res2);
return res;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
build(1,1,n);
while(m--)
{
int op,l,r,v;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&l,&r,&v);
modify_add(1,l,r,v);
}
else if(op==2)
{
scanf("%d%d%d",&l,&r,&v);
modify_ntg(1,l,r,v);
}
else if(op==3)
{
scanf("%d%d%d",&l,&r,&v);
modify_xtg(1,l,r,v);
}
else
{
scanf("%d%d",&l,&r);
printf("%d\n",query(1,l,r).maxt);
}
}
return 0;
}