Cod sursa(job #1053787)

Utilizator Kira96Denis Mita Kira96 Data 12 decembrie 2013 22:54:18
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
#define N 100100
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
int i,n,v[N],a,b,m;
long long sum[N],DR,sol,S[N<<2],D[N<<2],H[N<<2];
void us(int st,int dr,int po)
{
	if(st==dr)
	{
		S[po]=v[i];
		return;
	}
	int mij=(st+dr)>>1;
	if(i<=mij)
		us(st,mij,po<<1);
	else
		us(mij+1,dr,(po<<1)+1);
	S[po]=max(S[po<<1],sum[mij]-sum[st-1]+S[(po<<1)+1]);
}
void ud(int st,int dr,int po)
{
	if(st==dr)
	{
		D[po]=v[i];
		return;
	}
	int mij=(st+dr)>>1;
	if(i<=mij)
		ud(st,mij,po<<1);
	else
		ud(mij+1,dr,(po<<1)+1);
	D[po]=max(D[(po<<1)+1],sum[dr]-sum[mij]+D[po<<1]);
}
void up(int st,int dr,int po)
{
	if(st==dr)
	{
		H[po]=v[i];
		return;
	}
	int mij=(st+dr)>>1;
	if(i<=mij)
		up(st,mij,po<<1);
	else
		up(mij+1,dr,(po<<1)+1);
	H[po]=max(max(H[po<<1],H[(po<<1)+1]),D[po<<1]+S[(po<<1)+1]);
}
void find(int st,int dr,int po)
{
	if(st>=a&&dr<=b)
	{
		sol=max(sol,H[po]);
		if(S[po]+DR>sol)
			sol=S[po]+DR;
		DR=max(sum[dr]-sum[st-1]+DR,D[po]);
		if(DR<0)
			DR=0;
		return;
	}
	int mij=(st+dr)>>1;
	if(a<=mij)
		find(st,mij,po<<1);
	if(b>mij)
		find(mij+1,dr,(po<<1)+1);
}
int main ()
{
	f>>n>>m;
	for(i=1;i<=n;++i)
	{
		f>>v[i];
		sum[i]=sum[i-1]+v[i];
		us(1,n,1);
		ud(1,n,1);
		up(1,n,1);
	}
	for(i=1;i<=m;++i)
	{
		f>>a>>b;
		sol=(1<<30);
		sol*=sol;
		sol*=(-1);
		DR=0;
		find(1,n,1);
		g<<sol<<"\n";
	}
	return 0;
}