Cod sursa(job #2476426)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 18 octombrie 2019 20:20:38
Problema Cuburi2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <stdio.h>

using namespace std;

const int NMAX = 250005;
long long costst[NMAX], costdr[NMAX], sst[NMAX], sdr[NMAX], v[NMAX];

int main() {

    freopen ("cuburi2.in", "r", stdin);
    freopen ("cuburi2.out", "w", stdout);

    int n, m, i, st, dr, a, b, x, r;
    long long sum, minim, dif, cst, cdr;
    scanf ("%d%d", &n, &m);
    for (i = 1; i <= n; i++)
        scanf ("%lld", &v[i]);

    sum = 0;
    for (i = 1; i <= n; i++) {
        costst[i] = costst[i - 1] + sum;
        sum += v[i];
        sst[i] = sst[i - 1] + v[i];
    }
    sum = 0;
    for (i = n; i >= 1; i--) {
        costdr[i] = costdr[i + 1] + sum;
        sum += v[i];
        sdr[i] = sdr[i - 1] + v[i];
    }

    for (i = 1; i <= m; i++) {
        scanf ("%d%d", &a, &b);
        st = a;
        dr = b;
        minim = sst[n] + 1;
        while (st <= dr) {
            x = (st + dr) / 2;
            cst = sst[x - 1] - sst[a - 1];
            cdr = sst[b] - sst[x];

            if (cst < cdr) {
                dif = cdr - cst;
                st = x + 1;
            }
            else {
                dif = cst - cdr;
                dr = x - 1;
            }
            if (dif < minim) {
                r = x;
                minim = dif;
            }
        }
        printf ("%d %d\n", r, costst[r] - costst[a] - sst[a - 1] * (r - a) + costdr[r] - costdr[b] - sdr[b + 1] * (b - r));
    }

    return 0;
}