Здравствуйте, возник вопрос по задаче Login - Codeforces , где мое решение берет ВА на 7 тесте
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define F first
#define S second
ll INF=1e18;
vector <ll> val(3000003,-INF);
vector <ll> mxa(8000008,-INF);
vector <ll> mxb(8000008,-INF);
vector <ll> lza(8000008,0);
void build(ll v,ll tl,ll tr)
{
if(tl==tr)
{
mxa[v]=val[tl];
mxb[v]=val[tl];
return;
}
ll tm=(tl+tr)/2;
build(v*2,tl,tm);
build(v*2+1,tm+1,tr);
mxa[v]=max(mxa[v*2],mxa[v*2+1]);
mxb[v]=max(mxb[v*2],mxb[v*2+1]);
}
void push(ll v,ll tl,ll tr)
{
if(!lza[v]) return;
if(tl!=tr)
{
mxa[v*2]+=lza[v];
mxa[v*2+1]+=lza[v];
mxb[v*2]=max(mxa[v*2],mxb[v*2]);
mxb[v*2+1]=max(mxa[v*2+1],mxb[v*2+1]);
lza[v*2]+=lza[v];
lza[v*2+1]+=lza[v];
}
lza[v]=0;
}
void update(ll v,ll tl,ll tr,ll l,ll r,ll value)
{
push(v,tl,tr);
if(r<tl || l>tr) return;
if(l<=tl && tr<=r)
{
push(v,tl,tr);
lza[v]+=value;
mxa[v]+=value;
mxb[v]=max(mxb[v],mxa[v]);
return;
}
ll tm=(tl+tr)/2;
update(v*2,tl,tm,l,r,value);
update(v*2+1,tm+1,tr,l,r,value);
mxa[v]=max(mxa[v*2],mxa[v*2+1]);
mxb[v]=max(mxb[v*2],mxb[v*2+1]);
}
ll get(ll v,ll tl,ll tr,ll l,ll r)
{
push(v,tl,tr);
if(r<tl || l>tr) return -INF;
if(l<=tl && tr<=r)
{
push(v,tl,tr);
return mxb[v];
}
ll tm=(tl+tr)/2;
ll res=max(get(v*2,tl,tm,l,r),get(v*2+1,tm+1,tr,l,r));
mxa[v]=max(mxa[v*2],mxa[v*2+1]);
mxb[v]=max(mxb[v*2],mxb[v*2+1]);
return res;
}
int main()
{
freopen("max.in","r",stdin);freopen("max.out","w",stdout);
ios_base::sync_with_stdio(0);cin.tie(0);
ll n;
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>val[i];
}
build(1,1,n);
ll q;
cin>>q;
for(ll i=1;i<=q;i++)
{
ll temp,l,r,x;
cin>>temp>>l>>r;
if(temp==1)
{
cin>>x;
update(1,1,n,l,r,x);
}
else
{
cout<<get(1,1,n,l,r)<<"\n";
}
}
return 0;
}
/*
*/
Почему?
