Pagini recente » Cod sursa (job #2087555) | Cod sursa (job #352919) | Cod sursa (job #613693) | Cod sursa (job #2467628) | Cod sursa (job #1990516)
#include <cstdio>
using namespace std;
FILE *fin = fopen ("cuburi2.in", "r"), *fout = fopen ("cuburi2.out", "w");
typedef long long i64;
const int nmax = 25e4 + 5;
int n, x, y;
int v[nmax + 1];
i64 s[nmax + 1], sp[nmax + 1];
inline i64 check (int pos) {
i64 st, dr;
st = (sp[pos - 1] - sp[x - 1]) * pos - (s[pos - 1] - s[x - 1]);
dr = (s[ y ] - s[ pos ]) - (sp[ y ] - sp[ pos ]) * pos;
return st + dr;
}
int main() {
int m;
fscanf(fin, "%d%d", &n, &m);
for (int i = 1; i <= n; ++ i) {
fscanf(fin, "%d", &v[ i ]);
sp[ i ] = sp[i - 1] + 1LL * v[ i ];
s[ i ] = s[i - 1] + 1LL * i * v[ i ];
}
sp[n + 1] = sp[ n ];
s[n + 1] = s[ n ];
int n2;
for (n2 = 1; (n2 << 1) <= n; n2 <<= 1) {
}
for (int i = 1; i <= m; ++ i) {
fscanf(fin, "%d%d", &x, &y);
int ans = x;
for (int step = n2; step > 0; step >>= 1) {
if (ans + step <= y && check(ans + step) >= check(ans + step + 1)) {
ans += step;
}
}
if (check( ans ) >= check(ans + 1)) ++ ans;
fprintf(fout, "%d %lld\n", ans, check(ans));
}
fclose( fin );
fclose( fout );
return 0;
}