Cod sursa(job #531149)

Utilizator loginLogin Iustin Anca login Data 8 februarie 2011 22:58:34
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
# include <fstream>
# include <iostream>
# define DIM 100003
using namespace std;
struct arb{
	int m, M;
}a[2*DIM];
int n, m, s[DIM];
ifstream fin ("sequencequery.in");

void upd(int k, int st, int dr, int p)
{
	if (st>=dr)
	{
		a[k].m=p-1;
		a[k].M=p;
		return;
	}
	int mij=(st+dr)/2;
	if (p<=mij)
		upd(2*k,st,mij,p);
	else
		upd(2*k+1, mij+1, dr, p);
	int m, M, m1=a[2*k].m, m2=a[2*k+1].m, M1=a[2*k].M, M2=a[2*k+1].M;
	if (s[M1]-s[m1]>=s[M2]-s[m1] && s[M1]-s[m1]>=s[M2]-s[m2])
		M=M1, m=m1;
	else if (s[M2]-s[m1]>=s[M1]-s[m1] && s[M2]-s[m1]>=s[M2]-s[m2])
		M=M2, m=m1;
	else if (s[M2]-s[m2]>=s[M1]-s[m1] && s[M2]-s[m2]>=s[M2]-s[m1])
		M=M2, m=m2;
	a[k].m=m;a[k].M=M;	
}

void read ()
{	
	fin>>n>>m;
	int x;
	for(int i=1;i<=n;++i)
	{
		fin>>x;
		s[i]=s[i-1]+x;
		upd(1, 1, n, i);
	}
}

arb query(int k, int st, int dr, int i, int j)
{
	if (st>=i && dr<=j)
		return a[k];
	int mij=(st+dr)/2, l=0, r=0;
	arb x, y;
	if (i<=mij)x=query(2*k, st, mij, i, j), l=1;
	if (j>mij)y=query(2*k+1, mij+1, dr, i, j), r=1;
	if (l && !r)return x;
	if (!l && r)return y;
	int m, M, m1=x.m, m2=y.m, M1=x.M, M2=y.M;
	if (s[M1]-s[m1]>s[M2]-s[m1] && s[M1]-s[m1]>s[M2]-s[m2])
		M=M1, m=m1;
	else if (s[M2]-s[m1]>s[M1]-s[m1] && s[M2]-s[m1]>s[M2]-s[m2])
		M=M2, m=m1;
	else if (s[M2]-s[m2]>s[M1]-s[m1] && s[M2]-s[m2]>s[M2]-s[m1])
		M=M2, m=m2;
	x.m=m;x.M=M;	
	return x;
}

void solve ()
{
	freopen("sequencequery.out", "w", stdout);
	int x, y;
	arb r;
	for(;m--;)
	{
		fin>>x>>y;
		r=query(1, 1, n, x, y);
		printf("%d\n",s[r.M]-s[r.m]);
	}
}			

int main ()
{
	read ();
	solve ();
	return 0;
}