Pagini recente » Cod sursa (job #1934063) | Cod sursa (job #2327862) | Cod sursa (job #3285785) | Cod sursa (job #714070) | Cod sursa (job #1249189)
#include <fstream>
#include <algorithm>
using namespace std;
#define NMax 100005
#define AMax 400005
#define inf 2100000000
#define fiu1 (nod<<1)
#define fiu2 ((nod<<1)|1)
#define mij ((st+dr)>>1)
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
int n,m;
int v[NMax];
struct arb{long long st,dr,best,sum;} A[AMax];
arb merged(arb f1,arb f2)
{
if(f1.best==-inf) return f2;
if(f2.best==-inf) return f1;
arb T;
T.sum=f1.sum+f2.sum;
T.best=max( f1.dr+f2.st , max(f1.best , f2.best) );
T.st=max( f1.st , f1.sum+f2.st );
T.dr=max( f2.dr , f2.sum+f1.dr );
return T;
}
void build(int nod,int st,int dr)
{
if(st==dr)
{
A[nod].st=A[nod].dr=A[nod].best=A[nod].sum=v[st];
}
else
{
build(fiu1,st,mij);
build(fiu2,mij+1,dr);
A[nod]=merged(A[fiu1],A[fiu2]);
}
}
arb query(int nod,int st,int dr,int a,int b)
{
if(a<=st && dr<=b)
{
return A[nod];
}
else if(st!=dr)
{
arb q1,q2;
q1.best=q2.best=-inf;
if(a<=mij) q1=query(fiu1,st,mij,a,b);
if(b>mij) q2=query(fiu2,mij+1,dr,a,b);
return merged(q1,q2);
}
}
int main()
{
int i,a,b;
arb sol;
f>>n>>m;
for(i=1;i<=n;++i) f>>v[i];
build(1,1,n);
for(i=1;i<=m;++i)
{
f>>a>>b;
sol=query(1,1,n,a,b);
g<<sol.best<<"\n";
}
f.close();
g.close();
return 0;
}