Cod sursa(job #257425)

Utilizator raduzerRadu Zernoveanu raduzer Data 13 februarie 2009 11:43:33
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>

const int MAX_N = 250010;

int n, m, poz, x, y;
int a[MAX_N];
long long f[MAX_N], f2[MAX_N], b2[MAX_N], b[MAX_N];

void search(int st, int dr)
{
	while (st <= dr)
	{
		int m = st + (dr - st) / 2;
		
		if (f[m - 1] - f[x - 1] < f[y] - f[m - 1])
		{
			st = m + 1;
			poz = m;
			continue;
		}
		dr = m - 1;
	}
}

int main()
{
	int i;
	freopen("cuburi2.in", "r", stdin);
	freopen("cuburi2.out", "w", stdout);
	
	scanf("%d %d", &n, &m);
	
	for (i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		f[i] = f[i - 1] + a[i];
		f2[i] = f2[i - 1] + f[i - 1];
	}
	
	int s = 0;
	for (i = n; i; --i)
	{
		b[i] = b[i + 1] + a[i];
		b2[i] = b2[i + 1] + b[i + 1];
	}
	
	for (; m; --m)
	{
		scanf("%d %d", &x, &y);
		
		poz = x;
		search(x, y);
		
		printf("%d %lld\n", poz, (f2[poz] - f2[x - 1] - f[x - 1] * (poz - x + 1)) + (b2[poz] - b2[y + 1] - b[y + 1] * (y - poz + 1)));
	}
}