Cod sursa(job #1813824)

Utilizator robx12lnLinca Robert robx12ln Data 23 noiembrie 2016 13:03:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#define DIM 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int D[18][DIM], P[DIM], a, b, n, m;
int main(){
    fin >> n >> m;
    for( int i = 1; i <= n; i++ ){
        fin >> D[0][i];
    }
    //D[k][i] = minimul de pe intervalul ( i, i + 2^k )
    //D[k][i] = min ( minimul de pe intervalul ( i, i + 2^(k-1) ), minimul de pe intervalul ( i + 2^(k-1), i + 2^k ) )
    for( int k = 1; (1<<k) <= n; k++ ){
        for( int i = 1; i + (1<<k) - 1 <= n; i++ ){
            D[k][i] = min( D[k - 1][i], D[k - 1][i + (1<<(k-1))] );
        }
    }
    //P[i] = exponentul celei mai mari puteri a lui 2 <= i
    P[1] = 0;
    for( int i = 2; i <= n; i++ ){
        P[i] = P[i / 2] + 1;
    }
    //query-uri
    for( int i = 1; i <= m; i++ ){
        fin >> a >> b;
        //vad ce putere de 2 <= b - a + 1(lg interval) imi verifica relatia 2^p * 2 >= b - a + 1
        //unde p este puterea cautata (exponentul puterii)
        int p = P[b - a + 1];
        fout << min( D[p][a], D[p][b - (1<<p) + 1] ) << "\n";
    }
    return 0;
}