Pagini recente » Cod sursa (job #1154661) | Cod sursa (job #1465976) | Cod sursa (job #532993) | Cod sursa (job #1238346) | Cod sursa (job #2254074)
#include <cstdio>
using namespace std;
const int NMAX = 250005;
int v[NMAX];
long long spst[NMAX];
long long spstt[NMAX];
long long spdr[NMAX];
long long spdrt[NMAX];
int main() {
int n, m;
freopen("cuburi2.in", "r", stdin);
freopen("cuburi2.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
}
for(int i = 1; i <= n; i++) {
spst[i] = v[i] + spst[i - 1];
spstt[i] = spstt[i - 1] + spst[i];
}
for(int i = n; i > 0; i--) {
spdr[i] = v[i] + spdr[i + 1];
spdrt[i] = spdrt[i + 1] + spdr[i];
}
for(int q = 1; q <= m; q++) {
int x, y;
scanf("%d%d", &x, &y);
int st = x, dr = y, last = x;
while(st <= dr) {
int mij = (st + dr) >> 1;
if(spst[mij - 1] - spst[x - 1] < spdr[mij] - spdr[y + 1]) {
st = mij + 1;
last = mij;
}
else {
dr = mij - 1;
}
}
long long sol = (spstt[last - 1] - spstt[x - 1] - spst[x - 1] * (last - x)) + (spdrt[last + 1] - spdrt[y + 1] - spdr[y + 1] * (y - last));
printf("%d %lld\n", last, sol);
}
return 0;
}