Cod sursa(job #2372111)

Utilizator dianamariaDiana Cataros dianamaria Data 6 martie 2019 21:32:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
#define dim 100003
#define dim1 22

using namespace std;

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

int v[dim];
int dp[dim1][dim];

int getint(bool c, int n)
{
    int lg = log(n) / log(2);
    if (c == 0 && (1 << lg) < n)
        lg++;
    return lg;
}

int main ()
{
    int n, m;
    in >> n >> m;
    int lg = getint ( 0, n );
    for (int i = 0; i < n; i++)
        in >> v[i];
    for (int i = 0; i <= lg; i++)
        for (int j = 0; j < n; j++)
            dp[i][j] = INT_MAX;

    for (int i = 0; i < n; i++)
        dp[0][i] = v[i];
    for (int i = 1; i <= lg; i++)
        for (int j = 0; j + (1 << i) - 1 < n; j++)
            dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);

    for ( ; m > 0; m-- )
    {
        int st, dr;
        in >> st >> dr;
        st--;
        dr--;
        int poz = getint(1, dr - st + 1);
        out << min(dp[poz][st], dp[poz][dr - (1 << poz) + 1]) << '\n';
    }
    return 0;
}