Cod sursa(job #1503752)

Utilizator felixiPuscasu Felix felixi Data 16 octombrie 2015 21:08:05
Problema Cuburi2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <math.h>

#define MAXN 250010
#define long long long

long n, m, i, x, cat, y, a[MAXN], v1[MAXN], v2[MAXN], v3[MAXN], v4[MAXN];

void show(long num) {
    long st = v2[num] - (v2[x - 1] + v1[x - 1] * (num - x + 1));
    long dr = v4[num] - (v4[y + 1] + v3[y + 1] * (y - num + 1));
    printf("%lld\n", st + dr);
}

long caut_ternara(long i1, long i2, long sol) {
    long mid = (i1 + i2) / 2;
    while (i1 <= i2) {
        mid = (i1 + i2) / 2;
        if (v1[y] - v1[mid - 1] > v1[mid - 1] - v1[x - 1] ) {
            sol = mid;
            i1 = mid + 1;
        } else {
            i2 = mid - 1;
        }
    }
    return sol;
}

int main() {
    freopen("cuburi2.in", "r", stdin);
    freopen("cuburi2.out", "w", stdout);
    scanf("%lld %lld", &n, &m);
    for (i = 1; i <= n; ++i) {
        scanf("%lld", &a[i]);
        v1[i] = v1[i - 1] + a[i];
        v2[i] = v2[i - 1] + v1[i - 1];
    }
    for (i = n; i >= 1; --i) {
        v3[i] = v3[i + 1] + a[i];
        v4[i] = v4[i + 1] + v3[i + 1];
    }
    for (i = 1; i <= m; ++i) {
        scanf("%lld %lld", &x, &y);
        cat = caut_ternara(x, y, x);
        printf("%lld ", cat);
        show(cat);
    }
    return 0;
}