Cod sursa(job #1445986)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 31 mai 2015 17:13:12
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<fstream>
#include<iostream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int NMAX = 100005;
const int LMAX = 18;

int P[LMAX][NMAX],n,lg[NMAX],m;

void read()
{

    in>>n>>m;
    for(int i = 1 ; i <= n ; ++i)
        in>>P[0][i];

    lg[1] = 0;
    for(int i = 2 ; i <= n ; ++i)
        lg[i] = lg[i/2] + 1;

}

void rmq()
{

    for(int i = 1 ; (1 << i) <= n ; ++i)
        for(int j = 1 ; j <= n - (1 << i) + 1 ; ++j)
            P[i][j] = min(P[i-1][j],P[i-1][j + (1 << (i-1))]);

}

int query(int x,int y)
{

    int len = y - x + 1;
    int k = lg[len];
    int diff = len - (1<<k);
    return min(P[k][x],P[k][x + diff]);
}

int main()
{

    read();
    rmq();
    int a,b;
    for( ; m ; --m){

        in>>a>>b;
        out<<query(a,b)<<"\n";
    }
    return 0;
}