Cod sursa(job #749604)

Utilizator danalex97Dan H Alexandru danalex97 Data 17 mai 2012 19:51:39
Problema Cuburi2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
using namespace std;

#define Nmax 250011
#define Sums(mid,st,dr) ( Sum[mid] - Sts[st-1] - Drs[dr+1] )
#define Const(point) Sums(point,x,y)

int N,M;
int A[Nmax],Sum[Nmax],S[Nmax];
int Sts[Nmax],Drs[Nmax];
int x,y,P;

/*int BinFire(int St,int Dr)
{
	if ( St==Dr )
		return St;
	
	if ( Dr-St==1 )
	{
		if ( Const(Dr) < Const(St) )
			return Dr;
		else
			return St;
	}
	
	int Mid=(St+Dr)/2;
	if ( Sums(Mid,St,Mid) - Sums(Mid,Mid,Dr) > 0 )
		return BinFire(St,Mid);
	return BinFire(Mid,Dr);
}*/

int main()
{
	freopen("cuburi2.in","r",stdin);
	freopen("cuburi2.out","w",stdout);
	
	scanf("%d%d",&N,&M);
	for (int i=1;i<=N;++i)
		scanf("%d",&A[i]);
	
	for (int i=1;i<=N;++i) 
		S[i]=S[i-1]+A[i];	
	for (int i=1;i<=N;++i) 
		Sts[i]=(Sts[i-1]+S[i-1])+A[i];
	for (int i=N;i;--i)
		S[i]=S[i+1]+A[i];
	for (int i=N;i;--i) 
		Drs[i]=(Drs[i+1]+S[i+1])+A[i];
	for (int i=1;i<=N;++i) 
		S[i]=S[i-1]+A[i];	
	
	for (int i=1;i<=N;++i)
		Sum[i]=Sts[i-1]+Drs[i+1];
	
	for (;M;--M)
	{
		scanf("%d%d",&x,&y);
		
		P = x;
		int front=x, back=y , middle=0 ;
		
		while (front <= back)
		{
			middle = (front + back) / 2;
			
			if (S[middle-1] - S[x-1] < S[y] - S[middle-1])
			{
				front = middle + 1;
				P = middle;
			}
			else back = middle - 1;
		}
		
		printf("%d %d\n",P,Const(P));
	}
}