Cod sursa(job #2211511)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 10 iunie 2018 18:30:57
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>

using namespace std;

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

const int N = 100007;

int v[N], rmq[N][17], lololol[N];

int op(int val1, int val2) {
    return min(val1, val2);
}

int main()
{
    int n, el(-1), k(0), m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
    }
    for (int i = 1; i <= n; ++i) {
        rmq[i][0] = v[i];
    }
    int pas = 2, lol(1);
    while (pas < n) {
        for (int i = 1; i <= n - pas + 1; ++i) {
            int alpha = pas>>1;
            rmq[i][lol] = op(rmq[i + alpha][lol - 1], rmq[i][lol - 1]);
        }
        ++lol;
        pas<<=1;
    }
    pas = 1;
    lol = 0;
    while (pas <= n) {
        for (int i = pas; i < (pas<<1); ++i) {
            lololol[i] = lol;
        }
        ++lol;
        pas <<= 1;
    }
    int x, y;
    for (int i = 0; i < m; ++i) {
        cin >> x >> y;
        cout << min(rmq[x][lololol[y - x + 1]], rmq[y - (1<<lololol[y - x + 1]) + 1][lololol[y - x + 1]]) << "\n";
    }
    return 0;
}