Cod sursa(job #254245)

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

#define MAXN 250010
#define inf 1000000000000000000LL
#define ll long long
#define C 100
#define min(a,b) (a < b ? a : b)
#define max(a,b) (a > b ? a : b)

int N, M, NR, m, P[10];
ll best;
int A[MAXN];
ll V[MAXN], V2[MAXN];
ll S[MAXN], S2[MAXN];

int main()
{
	freopen("cuburi2.in" , "r", stdin);
	freopen("cuburi2.out", "w", stdout);

	int i, j, x, y;
	long long aux;

	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 >= 1; i--)
	{
		S2[i] = S2[i+1] + A[i];
		V2[i] = V2[i+1] + S2[i+1];
	}

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

		best = inf;

		m = (x+y) / 2;
		for (i = max(x, m-C); i <= min(y, m+C); i++)
		{
			aux = V[i] - (V[x-1] + S[x-1] * (i-x+1)) + V2[i] - (V2[y+1] + S2[y+1] * (y-i+1));
			if (aux < best)
			{
				best = aux;
				P[1] = i;
			}
		}

		printf("%d %lld\n", P[1], best);
	}

	return 0;
}