Cod sursa(job #2023407)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 18 septembrie 2017 21:42:13
Problema Cuburi2 Scor 6
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 250005

long long C[1 + MAXN];
long long S1[1 + MAXN], S2[1 + MAXN];
long long P[1 + MAXN];
long long S[1 + MAXN];

inline int min(int a, int b){
    return a < b ? a : b;
}
inline int max(int a, int b){
    return a > b ? a : b;
}

int main(){
    FILE*fi,*fo;
    fi = fopen("cuburi2.in","r");
    fo = fopen("cuburi2.out","w");

    int n, m;
    fscanf(fi,"%d%d", &n, &m);

    int s = 0;
    for(int i = 1; i <= n; i++){
        fscanf(fi,"%d", &C[i]);
        S1[i] = S1[i - 1] + s;
        s = s + C[i];
        P[i] = P[i - 1] + C[i] * i;
        S[i] = S[i - 1] + C[i];
    }
    s = 0;
    for(int i = n; i >= 1; i--){
        S2[i] = S2[i + 1] + s;
        s = s + C[i];
    }

    for(int i = 1; i <= m; i++){
        int a, b;
        fscanf(fi,"%d%d", &a, &b);
        long long pivot = (P[b] - P[a - 1])/(S[b] - S[a - 1]);
        int optim = a;
        for(int i = max(a, pivot - 5); i <= min(b, pivot + 5); i++)
            if(S1[optim] - S1[a] - S[a - 1] * (optim - a) + S2[optim] - S2[b] - (S[n] - S[b]) * (b - optim) > S1[i] - S1[a] - S[a - 1] * (i - a) + S2[i] - S2[b] - (S[n] - S[b]) * (b - i))
                optim = i;
        fprintf(fo,"%d %lld\n", optim, S1[optim] - S1[a] - S[a - 1] * (optim - a) + S2[optim] - S2[b] - S[b + 1] * (b - optim));
    }
    fclose(fi);
    fclose(fo);
    return 0;
}