Cod sursa(job #1990555)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 12 iunie 2017 15:32:01
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#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;
}

inline i64 dif (int pos) {
    return sp[ y ] + sp[x - 1] - 2 * sp[ pos ];
}

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 ];

    for (int i = 1; i <= m; ++ i) {
        fscanf(fin, "%d%d", &x, &y);

        int n2;
        for (n2 = 1; (n2 << 1) <= y - x + 1; n2 <<= 1) {
        }

        int ans = x;
        for (int step = n2; step > 0; step >>= 1) {
            if (ans + step + 1 <= y && dif(ans + step) > 0) {
                ans += step;
            }
        }

        if (ans + 1 <= y && dif( ans ) > 0) ++ ans;

        fprintf(fout, "%d %lld\n", ans, check(ans));
    }

    fclose( fin );
    fclose( fout );
    return 0;
}