Cod sursa(job #274528)

Utilizator 630r63Ilinca George Mihai 630r63 Data 9 martie 2009 20:23:12
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>

#define NMAX 250100

#define wSum(i, p) (wsum[p] - wsum[i - 1])
#define wdsumLR(i, p) ((wsum[p] - wsum[i - 1]) * (long long) (p) - (wdsum[p] - wdsum[i - 1]))
#define wdsumRL(i, p) ((wdsum[p] - wdsum[i - 1]) - (wsum[p] - wsum[i - 1]) * (long long) (i))
#define cost(i, j, p) (wdsumLR(i,p) + wdsumRL(p, j))
#define min(a, b) ((a) < (b) ? (a) : (b))

long long w[NMAX], wsum[NMAX], wdsum[NMAX], wleft, wright, C, C1;
int i, j, k, N, M, li, ls, mid, lok, lok2;

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

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

	for (wsum[0] = wdsum[0] = 0, i = 1; i <= N; i++)
	{
		scanf("%lld", &w[i]);
		wsum[i] = wsum[i - 1] + w[i];
		wdsum[i] = wdsum[i - 1] + w[i] * (long long) i;
	}
	
	while (M--)
	{
		scanf("%d %d", &i, &j);

		li = i; ls = j; lok = i;

		while (li <= ls)
		{
			mid = (li + ls) / 2;
			wleft = wSum(i, mid - 1);
			wright = wSum(mid + 1, j);

			if (wright - wleft > 0)
				lok = mid,
				li = mid + 1;
			else
				ls = mid - 1;
		}

		C = cost(i, j, lok);
		if (lok < j)
		{
			lok2 = lok + 1;
			C1 = cost(i, j, lok2);
			if (C1 < C)
				C = C1, lok = lok2;
		}

		printf("%d %lld\n", lok, C);
		//fprintf(stderr, "i=%d, j=%d, lok=%d, wdsumLR=%lld, wdsumRL=%lld\n", i, j, lok, wdsumLR(i, lok), wdsumRL(lok, j));
	}

	return 0;
}