Cod sursa(job #2210795)

Utilizator dragos.galeteanu2001Dragos Iulian dragos.galeteanu2001 Data 7 iunie 2018 23:21:27
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>

using namespace std;

int n, m;
long long v[250001], left_sum[250001], right_sum[250001];

inline long long calculateCost(int left_index, int right_index, int middle_index)
{
	long long leftCost = left_sum[middle_index - 1] - left_sum[left_index - 1] - v[left_index - 1] * (middle_index - left_index);
	long long rightCost = right_sum[middle_index + 1] - right_sum[right_index + 1] - (v[n] - v[right_index]) * (right_index - middle_index);
	return leftCost + rightCost;
}

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

	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &v[i]);
		v[i] += v[i - 1];
	}

	for (int i = 1; i <= n; ++i) left_sum[i] = left_sum[i - 1] + v[i];

	for (int i = n; i; --i) right_sum[i] = right_sum[i + 1] + v[n] - v[i - 1];

	for (int i = 1; i <= m; ++i) {
		int left_index, right_index;
		scanf("%d%d", &left_index, &right_index);

		int pos, step;
		for (step = 1; step <= (right_index - left_index + 1); step <<= 1);
		for (pos = left_index; step; step >>= 1)
			if (pos + step <= right_index && v[pos + step - 1] - v[left_index - 1] < v[right_index] - v[pos + step - 1])
				pos += step;

		printf("%d %lld\n", pos, calculateCost(left_index, right_index, pos));
	}

	fclose(in);
	fclose(out);

    return 0;
}