Cod sursa(job #260291)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 16 februarie 2009 21:22:54
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <math.h>

#define MAXN 250010
#define long long long

long n, m, i, x, cat, y, a[MAXN], v1[MAXN], v2[MAXN], v3[MAXN], v4[MAXN];

void show(long num) {
	long st = v2[num] - (v2[x - 1] + v1[x - 1] * (num - x + 1));
	long dr = v4[num] - (v4[y + 1] + v3[y + 1] * (y - num + 1));
	printf("%lld\n", st + dr);
}

long caut_ternara(long i1, long i2, long sol) {
	long mid = (i1 + i2) / 2;
	while (i1 <= i2) {
		mid = (i1 + i2) / 2;
		if (v1[y] - v1[mid - 1] > v1[mid - 1] - v1[x - 1] ) {
			sol = mid;
			i1 = mid + 1;
		} else {
			i2 = mid - 1;
		}
	}
	return sol;
}

int main() {
	freopen("cuburi2.in", "r", stdin);
	freopen("cuburi2.out", "w", stdout);
	scanf("%lld %lld", &n, &m);
	for (i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
		v1[i] = v1[i - 1] + a[i];
		v2[i] = v2[i - 1] + v1[i - 1];
	}
	for (i = n; i >= 1; --i) {
		v3[i] = v3[i + 1] + a[i];
		v4[i] = v4[i + 1] + v3[i + 1];
	}
	for (i = 1; i <= m; ++i) {
		scanf("%lld %lld", &x, &y);
		cat = caut_ternara(x, y, x);
		printf("%lld ", cat);
		show(cat);
	}
	return 0;
}