Cod sursa(job #2051222)

Utilizator cipri321Marin Ciprian cipri321 Data 28 octombrie 2017 17:39:24
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#define DIM (1<<19)
using namespace std;
ifstream fi("sequencequery.in");
ofstream fo("sequencequery.out");
long long A[DIM]/*inceput*/,B[DIM]/*sfarsit*/,C[DIM]/*tot*/,S[DIM]/*suma*/;
int X[DIM/2];
int n,m;
long long tip,a,b;
void init(int nod, int l, int r)
{
	if (l == r)
	{
		A[nod] = B[nod] = C[nod] = X[l];
		S[nod] = X[l];
	}
	else 
	{
		int mid=(l+r)/2;
		init(2*nod, l, mid);
		init(2*nod+1, mid+1, r);
		A[nod] = max(A[2*nod], S[2*nod]+A[2*nod+1]);
		B[nod] = max(B[2*nod]+S[2*nod+1], B[2*nod+1]);
		C[nod] = max(max(C[2*nod], C[2*nod+1]), B[2*nod]+A[2*nod+1]);
		
		S[nod] = S[2*nod]+S[2*nod+1];
	}
}

long long rez,s;
void query(int nod, int l, int r,int st,int dr)
{
	if (st <= l && r <= dr) {
		rez = max(rez, max(s+A[nod], C[nod]));
		s = max(s+S[nod], B[nod]);
	} else {
		int mid=(l+r)/2;
		if (st <= mid) query(2*nod,    l, mid,st,dr);
		if (dr >  mid) query(2*nod+1, mid+1,  r,st,dr);
	}
}


int main()
{
	fi>>n>>m;
	for(int i=1;i<=n;i++)
		fi>>X[i];
	init(1,1,n);
	for(int i=1;i<=m;i++)
	{
		fi>>a>>b;
		s=0,rez=-2000000000000;
		query(1,1,n,a,b);
		fo<<rez<<"\n";
	}
	fi.close();
	fo.close();
	return 0;
}