Pagini recente » Borderou de evaluare (job #2012893) | Cod sursa (job #343686) | Cod sursa (job #3286023) | Cod sursa (job #2505810) | Cod sursa (job #2062299)
#include <stdio.h>
#include <stdlib.h>
#define L 20
#define NMAX 250000
typedef long long u64;
int v[1 + NMAX];
int sps1[1 + NMAX], sps2[1 + NMAX];
int spd1[2 + NMAX], spd2[2 + NMAX];
int scor[1 + NMAX];
int n, m;
u64 cost(int st, int dr, int i) {
u64 val;
val = 1LL * sps2[i - 1] - sps2[st - 1] - 1LL * (i - st) * sps1[st - 1];
val += 1LL * spd2[i + 1] - spd2[dr + 1] - 1LL * (dr - i) * spd1[dr + 1];
return val;
}
int bs(int st, int dr) {
int r = st;
int pas = 1 << 19;
while (pas) {
if (r + pas <= dr && cost (st, dr, r + pas) < cost(st, dr, r + pas - 1))
r += pas;
pas /= 2;
}
return r;
}
int main(){
FILE *fin = fopen("cuburi2.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
fscanf(fin, "%d", &v[i]);
sps1[i] = sps1[i - 1] + v[i];
sps2[i] = sps2[i - 1] + sps1[i];
}
for (int i = n; i > 0; --i) {
spd1[i] = spd1[i + 1] + v[i];
spd2[i] = spd2[i + 1] + spd1[i];
}
int st, dr;
FILE *fout = fopen("cuburi2.out", "w");
for (int k = 1; k <= m; ++k) {
fscanf(fin, "%d%d", &st, &dr);
int p = bs(st, dr);
fprintf(fout, "%d %d\n", p, cost(st, dr, p));
}
fclose(fin);
fclose(fout);
return 0;
}