Cod sursa(job #254241)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 7 februarie 2009 02:14:48
Problema Cuburi2 Scor Ascuns
Compilator cpp Status done
Runda Marime 1 kb
#include <stdio.h>

#define MAXN 250010
#define ll long long
#define FIN "cuburi2.in"
#define FOK "cuburi2.out"

int N, M, P;
ll Sol;
int A[MAXN];
ll S[MAXN], S2[MAXN], V[MAXN], V2[MAXN];

inline ll calc(int P, int x, int y)
{
	return V[P] - (V[x-1] + S[x-1] * (P-x+1)) + V2[P] - (V2[y+1] + S2[y+1] * (y-P+1));
}

int main()
{
	freopen(FIN, "r", stdin);
	freopen(FOK, "w", stdout);

	int i, x, y, front, middle, back;

	scanf("%d %d ", &N, &M);

	for (i = 1; i <= N; i++) scanf("%d ", &A[i]);

	for (i = 1; i <= N; i++) 
	{
		S[i] = S[i-1] + A[i];
		V[i] = V[i-1] + S[i-1];
	}

	for (i = N; i > 0 ; i--)
	{
		S2[i] = S2[i+1] + A[i];
		V2[i] = V2[i+1] + S2[i+1];
	}

	for (i = 1; i <= M; i++)
	{
		scanf("%d %d ", &x, &y);

		front = x, back = y;
		P = x;

		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;
		}
	
		Sol = calc(P, x, y);

		printf("%d %lld\n", P, Sol);
	}

	return 0;
}