Cod sursa(job #749609)

Utilizator danalex97Dan H Alexandru danalex97 Data 17 mai 2012 20:11:37
Problema Cuburi2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 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)) )

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

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];
		V[i] = V[i-1] + S[i-1];
	}
	for (int i=N;i;--i)
	{
		S2[i] = S2[i+1] + A[i];
		V2[i] = V2[i+1] + S2[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 %lld\n",P,Calc(P,x,y));
	}
}