Cod sursa(job #2059219)

Utilizator zeboftwAlex Mocanu zeboftw Data 6 noiembrie 2017 19:44:33
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100005;

int lg[NMAX], rmq[NMAX][18], v[NMAX];

// 0 1 2 3 4 5 6 7 8 9 10 11

int main()
{
    int n, m;

    fin >> n >> m;

    for (int i=1; i<=n; i++) {
        fin >> v[i];
        rmq[i][0] = v[i];
    }

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

    for (int i=1; 1<<i <= n; i++) {
        for (int j=1; j <= n - (1 << i) + 1; j++) {
            if (rmq[j][i-1] <= rmq[j + (1 << (i-1)) ][i-1])
                rmq[j][i] = rmq[j][i-1];
            else
                rmq[j][i] = rmq[j + (1 << (i-1)) ][i-1];
        }
    }

    for (int i=1; i<=m; i++) {
        int x, y;
        fin >> x >> y;
        int dif = y-x+1;
        dif = lg[dif];
        if (rmq[x][dif] <= rmq[y-(1<<dif)+1][dif])
            fout << rmq[x][dif] << '\n';
        else
            fout << rmq[y-(1<<dif)+1][dif] << '\n';
    }

    return 0;
}