Pagini recente » Cod sursa (job #79831) | Cod sursa (job #355531) | Cod sursa (job #2895881) | Cod sursa (job #346974) | Cod sursa (job #2475044)
#include <bits/stdc++.h>
using namespace std;
//#define fin stdin
//#define fout stdout
FILE *fin = fopen ("cuburi2.in", "r"), *fout = fopen ("cuburi2.out", "w");
const int MAXN = 320000;
const long long INF = 1e18;
int n;
long long st[MAXN + 1], dr[MAXN + 1], sl[MAXN + 1];
int h[MAXN + 1];
int good;
void preprocesare () {
int i;
for (i = 1; i <= n; i++)
sl[i] = sl[i - 1] + h[i];
for (i = 1; i <= n; i++)
st[i] = st[i - 1] + sl[i - 1];
for (i = n; i > 0; i--)
dr[i] = dr[i + 1] + (sl[n] - sl[i]);
}
inline long long val (int copst, int l, int r) {
if (copst < l || copst > r)
return INF;
long long valst = st[copst] - st[l] - (copst - l) * (sl[l - 1]);
long long valdr = dr[copst] - dr[r] - (r - copst) * (sl[n] - sl[r]);
return valst + valdr;
}
inline int solve (int l, int r) {
int st = l;
int dr = r;
int good = l;
while (st <= dr) {
int mid = (st + dr) / 2;
if (sl[mid - 1] - sl[l - 1] < sl[r] - sl[mid - 1]) {
good = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
return good;
}
int main() {
int q, l, r;
fscanf (fin, "%d%d", &n, &q);
for (int i = 1; i <= n; i++)
fscanf (fin, "%d", &h[i]);
preprocesare ();
while (q--) {
fscanf (fin, "%d%d", &l, &r);
int sol = solve (l, r);
fprintf (fout, "%d %lld\n", sol, val (sol, l, r));
}
fclose (fin);
fclose (fout);
return 0;
}