Cod sursa(job #1426348)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 29 aprilie 2015 15:35:53
Problema Cuburi2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <cstring>
#define DIM 260000
using namespace std;

ifstream fin ("cuburi2.in" );
ofstream fout("cuburi2.out");

int N, M, i, j, K, ok, minim, X;
long long D1[DIM], D2[DIM], V[DIM], Y;
long long A[DIM], B[DIM], D[DIM];

void SetUp(){
    fin >> N >> M;
    for(i = 1; i <= N; i ++){
        fin >> V[i];
        D[i] = D[i-1] + V[i];
    }
    for(i = 1; i <= N; i ++){
        A[i] = A[i-1] + V[i];
        B[i] = B[i-1] + V[i] * 1LL * i;
    }
    for(i = 1; i <= N; i ++)
        D1[i] = i * A[i] - B[i];
    memset(A, 0, sizeof(A));
    memset(B, 0, sizeof(B));
    for(i = 1; i <= N / 2; i ++)
        swap(V[i], V[N-i+1]);
    for(i = 1; i <= N; i ++){
        A[i] = A[i-1] + V[i];
        B[i] = B[i-1] + V[i] * 1LL * i;
    }
    for(i = 1; i <= N; i ++)
        D2[i] = i * A[i] - B[i];
    for(i = 1; i <= N / 2; i ++)
        swap(V[i], V[N-i+1]);
    for(i = 1; i <= N / 2; i ++)
        swap(D2[i], D2[N-i+1]);
    return;
}

long long Valoare(int pos, int st, int dr){
    return D1[pos] - D1[st] - (D[st-1] - D[0]) * (pos - st) + D2[pos] - D2[dr] - (D[N] - D[dr]) * (dr - pos);
}

void CautBin(int st, int dr){
    int p1 = st, p2 = dr;
    while(st <= dr){
        int mid = st + (dr - st) / 2;
        if(Valoare(mid, p1, p2) <= Valoare(mid-1, p1, p2)){
            if(Valoare(mid, p1, p2) <= Valoare(mid+1, p1, p2)){
                fout << mid << " " << Valoare(mid, p1, p2) << "\n";
                return;
            }
        }
        if(Valoare(mid+1, p1, p2) <= Valoare(mid, p1, p2))
            st = mid + 1;
        else
            dr = mid - 1;
    }
    return;
}

void Test(){
    for(i = 1; i <= N; i ++)
        fout << D1[i] << " ";
    fout << "\n";
    for(i = 1; i <= N; i ++)
        fout << D2[i] << " ";
    fout << "\n";
    return;
}

void CodeExpert(){
    //Test();
    //fout << Valoare(1, 1, 2) << "\n";
    for(M = M; M > 0; M --){
        fin >> X >> Y;
        CautBin(X, Y);
    }
    return;
}

int main(){
    SetUp();
    CodeExpert();
    return 0;
}