Cod sursa(job #1278020)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 28 noiembrie 2014 13:53:31
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int D[19][100100],i,j,P[19],a,b,n,m;

void preprocesare()
{
    for(int i = 1; (1 << i) <= n; i ++){
        for(int j = 1; j <= n; j ++){
            D[i][j] = D[i - 1][j];
            if (j + (1 << (i - 1)) <= n && D[i][j] > D[i - 1][j + (1 << (i - 1))])
                D[i][j] = D[i - 1][j + (1 << (i - 1))];
        }
    }
}
int RMQ(int a, int b)
{

    return min(D[P[b - a + 1]][a],D[P[b - a + 1]][b - (1 << P[b - a + 1]) + 1]);
}
int main()
{
    fin >> n >> m;
    for(i = 1; i <= n; i ++)
        fin >> D[0][i];
    preprocesare();
    P[1] = 0;
    for(i = 2; i <= n; i ++)
        P[i] = 1 + P[i / 2];

    for(i = 1; i <= m; i ++)
    {
        fin >> a >> b;
        fout << RMQ(a,b) << '\n';
    }
    return 0;
}