Cod sursa(job #1426363)

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

//ifstream fin ("cuburi2.in" );
//ofstream fout("cuburi2.out");
FILE *fin = fopen("cuburi2.in" ,"r");
FILE *fout= fopen("cuburi2.out","w");

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

inline int read(){
     int x=0;
     char ch = fgetc(fin);
     while(!isdigit(ch)){
          ch = fgetc(fin);
     }
     while(isdigit(ch)){
          x = 10 * x + ch - '0';
          ch = fgetc(fin);
     }
    return x;
}

inline void SetUp(){
    N = read(); M = read();
    //Parse();
    for(i = 1; i <= N; i ++){
        //fscanf(fin, "%lld", &V[i]);
        V[i] = read();
        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 * 1LL * A[i] - B[i];
    for(i = N; i >= 1; i --){
        A[i] = A[i+1] + V[i];
        B[i] = B[i+1] + V[i] * 1LL * (N - i + 1);
    }
    for(i = N; i >= 1; i --)
        D2[i] = (N - i + 1) * 1LL * A[i] - B[i];
    return;
}

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

inline void CautBin(int st, int dr){
    int p1 = st, p2 = dr;
    while(st <= dr){
        int mid = st + (dr - st) / 2;
        unsigned long long val1 = Valoare(mid, p1, p2);
        unsigned long long val2 = Valoare(mid-1, p1, p2);
        unsigned long long val3 = Valoare(mid+1, p1, p2);
        if(val1 <= val2 && val1 <= val3){
           fprintf(fout, "%d %lld\n", mid, val1);
           return;
        }
        if(val3 <= val1)
            st = mid + 1;
        else
            dr = mid - 1;
    }
    return;
}

void CodeExpert(){
    for(M = M; M > 0; M --){
        X = read(); Y = read();
        CautBin(X, Y);
    }
    return;
}

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