Pagini recente » Cod sursa (job #2508528) | Cod sursa (job #3005459) | Cod sursa (job #1169061) | Cod sursa (job #1415285) | Cod sursa (job #1017170)
#include<fstream>
#define MAXN 1<<19
using namespace std;
int s[MAXN],sleft[MAXN],sright[MAXN],n,m,x,y,val,p,sol,solR,sum[MAXN];
ifstream fin("maxq.in");
ofstream fout("maxq.out");
void update(int nod,int st,int dr)
{
if(st==dr && st==p)
{
s[nod]=val;
sleft[nod]=val;
sright[nod]=val;
sum[nod]=val;
return;
}
int m=(st+dr)/2;
if(st<=p && p<=m)
{
update(2*nod,st,m);
}
else
if(m<p && p<=dr)
{
update(2*nod+1,m+1,dr);
}
sum[nod]=sum[2*nod]+sum[2*nod+1];
sleft[nod]=sleft[2*nod];
if(sum[2*nod]+sleft[2*nod+1]>sleft[nod])
{
sleft[nod]=sleft[2*nod+1]+sum[2*nod];
}
sright[nod]=sright[2*nod+1];
if(sum[2*nod+1]+sright[2*nod]>sright[nod])
{
sright[nod]=sum[2*nod+1]+sright[2*nod];
}
s[nod]=s[2*nod];
if(s[nod]<s[2*nod+1])
{
s[nod]=s[2*nod+1];
}
if(s[nod]<sright[2*nod]+sleft[2*nod+1])
{
s[nod]=sright[2*nod]+sleft[2*nod+1];
}
if(sum[2*nod]+sum[2*nod+1]>s[nod])
s[nod]=sum[2*nod]+sum[2*nod+1];
}
void citire()
{
fin>>n;
for(int i=0;i<n;i++)
{
fin>>val;
p=i;
update(1,0,n-1);
}
}
void querry(int nod,int st,int dr)
{
if(x<=st && dr<=y)
{
if(sol<solR+sleft[nod])
sol=solR+sleft[nod];
if(s[nod]>sol)
sol=s[nod];
solR+=sum[nod];
if(sright[nod]>solR)
solR=sright[nod];
return;
}
int m=(st+dr)/2;
if(x<=m)
querry(2*nod,st,m);
if(m<y)
querry(2*nod+1,m+1,dr);
}
void getQuerries()
{
int op,a,b;
fin>>m;
for(int i=1;i<=m;i++)
{
fin>>op>>a>>b;
if(op==0)
{
p=a;
val=b;
update(1,0,n-1);
}
else
{
x=a;
y=b;
sol=solR=0;
querry(1,0,n-1);
fout<<sol<<"\n";
}
}
}
int main()
{
citire();
getQuerries();
return 0;
}