Pagini recente » Cod sursa (job #1825127) | Cod sursa (job #285290) | Cod sursa (job #3182252) | Cod sursa (job #2127311) | Cod sursa (job #2210795)
#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;
}