Pagini recente » Cod sursa (job #477428) | Cod sursa (job #3240053) | Cod sursa (job #2208424) | Cod sursa (job #707119) | Cod sursa (job #2476430)
#include <iostream>
#include <stdio.h>
using namespace std;
const int NMAX = 250005;
long long costst[NMAX], costdr[NMAX], sst[NMAX], sdr[NMAX], v[NMAX];
int main() {
freopen ("cuburi2.in", "r", stdin);
freopen ("cuburi2.out", "w", stdout);
int n, m, i, st, dr, a, b, x, r;
long long sum, minim, dif, cst, cdr;
scanf ("%d%d", &n, &m);
for (i = 1; i <= n; i++)
scanf ("%lld", &v[i]);
sum = 0;
for (i = 1; i <= n; i++) {
costst[i] = costst[i - 1] + sum;
sum += v[i];
sst[i] = sst[i - 1] + v[i];
}
sum = 0;
for (i = n; i >= 1; i--) {
costdr[i] = costdr[i + 1] + sum;
sum += v[i];
sdr[i] = sdr[i + 1] + v[i];
}
for (i = 1; i <= m; i++) {
scanf ("%d%d", &a, &b);
st = a;
dr = b;
minim = sst[n] + 1;
while (st <= dr) {
x = (st + dr) / 2;
cst = sst[x - 1] - sst[a - 1];
cdr = sst[b] - sst[x];
if (cst < cdr) {
dif = cdr - cst;
st = x + 1;
}
else {
dif = cst - cdr;
dr = x - 1;
}
if (dif < minim) {
r = x;
minim = dif;
}
}
printf ("%d %lld\n", r, costst[r] - costst[a] - sst[a - 1] * (r - a) + costdr[r] - costdr[b] - sdr[b + 1] * (b - r));
}
return 0;
}