Cod sursa(job #2062299)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 10 noiembrie 2017 10:48:41
Problema Cuburi2 Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.27 kb
#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;
 }