Cod sursa(job #1342513)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 14 februarie 2015 09:50:32
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");


const int N = 100001;
const int LOGN = 17;

int n, m;
int r[LOGN][N];
int lg[N];


inline int min(int x, int  y)
{
    return (x < y) ? x : y;
}


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

    for(int i = 1; i < LOGN; i++)
        for(int j = 1; j <= n; j++)
        {
            if(j + (1 << i) - 1 > n)
                continue;

            r[i][j] = min(r[i - 1][j], r[i - 1][j + (1 << (i - 1))]);
        }
}


void citire()
{
    in >> n >> m;

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

void query(int a, int b)
{
    int l = lg[b - a + 1];
    out << min(r[l][a], r[l][b - (1 << l) + 1]) << '\n';
}

int main()
{
    citire();
    rmq();
    for(int i = 1; i <= m; i++)
    {
        int a, b;
        in >> a >> b;
        query(a, b);
    }
    return 0;
}