Cod sursa(job #2566106)

Utilizator NotTheBatmanBruce Wayne NotTheBatman Data 2 martie 2020 18:50:17
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <iostream>
#include <stack>

using namespace std;

const int N = 100005;

int a[N], n, rmq[17][N], exp[N];

void Build_RMQ ()
{
    int i, j;
    for (i = 1; i <= n; i++)
        rmq[0][i] = a[i];
    for (i = 2; i <= n; i++)
        exp[i] = exp[i / 2] + 1;
    for (i = 1; i <= exp[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 Query (int a, int b)
{
    if (a > b) swap(a, b);
    int k = exp[b - a + 1];
    return min (rmq[k][a], rmq[k][b - (1 << k) + 1]);
}

void Read ()
{
    ifstream fin ("rmq.in");
    ofstream fout ("rmq.out");
    int q;
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        fin >> a[i];
    Build_RMQ();
    while (q--)
    {
        int x, y;
        fin >> x >> y;
        fout << Query(x, y) << "\n";
    }
    fout.close();
    fin.close();
}



int main()
{
    Read();
    return 0;
}