Cod sursa(job #749605)

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

#define Nmax 250011

#define Calc(P,x,y) ( V[P] - (V[x-1] + S[x-1] * (P-x+1)) + V2[P] - (V2[y+1] + S2[y+1] * (y-P+1)) )

long long N,M;
long long A[Nmax],S2[Nmax],S[Nmax];
long long V[Nmax],V2[Nmax];
long long x,y,P;

int main()
{
	freopen("cuburi2.in","r",stdin);
	freopen("cuburi2.out","w",stdout);
	
	scanf("%lld%lld",&N,&M);
	for (long long i=1;i<=N;++i)
		scanf("%lld",&A[i]);
	
	for (long long i=1;i<=N;++i) 
	{
		S[i] = S[i-1] + A[i];
		V[i] = V[i-1] + S[i-1];
	}
	for (long long i=N;i;--i)
	{
		S2[i] = S2[i+1] + A[i];
		V2[i] = V2[i+1] + S2[i+1];
	}
	
	for (;M;--M)
	{
		scanf("%lld%lld",&x,&y);
		
		P = x;
		long long 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("%lld %lld\n",P,Calc(P,x,y));
	}
}