Pagini recente » Cod sursa (job #737964) | Cod sursa (job #2597461) | Cod sursa (job #416841) | Cod sursa (job #1287836) | Cod sursa (job #2284121)
#include <bits/stdc++.h>
using namespace std;
FILE *fin = fopen ("cuburi2.in", "r"), *fout = fopen ("cuburi2.out", "w");
const int MAXN = 320000;
long long INF = 1e18;
int n;
long long st[MAXN + 1], dr[MAXN + 1], s1[MAXN + 1], s2[MAXN + 1];
int h[MAXN + 1];
int good;
void preprocesare () {
int i;
for (i = 1; i <= n; i++)
s1[i] = s1[i - 1] + h[i];
for (i = 1; i <= n; i++)
st[i] = st[i - 1] + 1LL * h[i] * i;
}
long long sol (int copst, int l, int r) {
long long valst = (s1[copst - 1] - s1[l - 1]) * copst - (st[copst - 1] - st[l - 1]);
long long valdr = (st[r] - st[copst]) - (s1[r] - s1[copst]) * copst;
return valst + valdr;
}
inline long long solve (int l, int r) {
long long mn;
int left = l;
int right = r;
// cautare ternara
mn = sol (l, l, r);
good = l;
while (left <= right) {
int lf = left + (right - left) / 3;
int rg = right - (right - left) / 3;
if (sol (lf, l, r) < mn) {
mn = sol (lf, l, r);
good = lf;
}
if (sol (rg, l, r) < mn) {
mn = sol (rg, l, r);
good = rg;
}
if (sol(lf, l, r) > sol (rg, l, r)) {
left = lf + 1;
}
else {
right = rg - 1;
}
}
return mn;
}
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);
long long sol = solve (l, r);
fprintf (fout, "%d %lld\n", good, sol);
}
fclose (fin);
fclose (fout);
return 0;
}