Cod sursa(job #1778092)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 13 octombrie 2016 14:25:31
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>
#define Nmax 100005

using namespace std;

int a[Nmax], rmq[18][Nmax], n, expo[Nmax];

void EXPO()
{
    int i;
    for(i = 2; i <= n; i++)
        expo[i] = 1 + expo[i / 2];
}

void RMQ()
{
    int i, j;
    for(i = 1; i <= n; i++)
        rmq[0][i] = a[i];

    for(i = 1; i <= expo[n]; i++)
        for(j = 1; j <= n - (1 << i) + 1; j++)
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}

int main()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    int k, i, e, lg, sol, x, y;
    f >> n >> k;
    for(i = 1; i <= n; i++)
        f >> a[i];
    EXPO();
    RMQ();
    for(i = 1; i <= k; i++)
    {
        f >> x >> y;
        e = expo[y - x + 1];
        lg = 1 << e;
        sol = min(rmq[e][x], rmq[e][y - lg + 1]);
        g << sol << "\n";
    }
    f.close();
    g.close();
    return 0;
}