Cod sursa(job #1164635)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 2 aprilie 2014 10:57:42
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

#define NMAX 100005
using namespace std;

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

int n, m;
int p2max[NMAX];
int rmq[25][NMAX];

void citire()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        fin >> rmq[0][i];
}
void make_rmq()
{

    for (int i = 1; (1<<i) <= n; ++i)
        for (int j = 1; j <= n - (1<<i) +1; ++j)
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+ (1<<(i-1))]);
}
int query (int x, int y)
{
    if (x > y) swap(x, y);
    int dif = y - x + 1;
    int p2 = p2max[dif];
    int sh = dif - (1<<p2);

    return min(rmq[p2][x], rmq[p2][x+sh]);
}
void solve()
{
    int x, y;

    for (int i = 2; i <= n; ++i) p2max[i] = p2max[i>>1] +1;

    while (m--)
    {
        fin >> x >> y;
        fout << query(x,y)<<'\n';
    }
}
int main()
{
    citire();
    make_rmq();
    solve();

    return 0;
}