Pagini recente » Cod sursa (job #908996) | Cod sursa (job #50806) | Cod sursa (job #775567) | Cod sursa (job #310977) | Cod sursa (job #2475023)
#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) {
if (copst < l || copst > r)
return INF;
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 st = l;
int dr = r;
mn = sol (l, l, r);
good = l;
while (st <= dr) {
int mid = (st + dr) / 2;
long long rez1 = sol (mid, l, r);
long long rez2 = sol (mid + 1, l, r);
if (mn > rez1) {
mn = rez1;
good = mid;
}
if (mn > rez2) {
mn = rez2;
good = mid + 1;
}
if (rez1 < rez2)
st = mid + 1;
else
dr = mid - 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;
}