Cod sursa(job #2026182)

Utilizator HumikoPostu Alexandru Humiko Data 23 septembrie 2017 21:09:50
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>

using namespace std;

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

int v[10001], dp[10001][25], log [10001];

int main()
{
    int n, m;
    fin>>n>>m;
    for ( int i = 1; i <= n; ++i )
        fin>>v[i];
    int x, y;
    for ( int i = 1; i <= n; ++i )
        dp[i][0] = min (v[i], v[i+1]);
    for ( int i = 2; i <= n; ++i )
        log[i] = log[i/2] + 1;
    for ( int i = 1; i <= log[n]; ++i )
    {
        for ( int j = 1; j <=n; ++j )
        {
            if ( j + (1<<i) > n )
                break;
            dp[j][i] = min (dp[j][i-1], dp[j+(1<<(i-1))][i-1]);
        }
    }
    while ( m-- )
    {
        fin>>x>>y;
        if ( x == y )
            fout<<v[x]<<'\n';
        else
            fout<<min( dp[x][log[y-x]], dp[y-(1<<log[y-x])][log[y-x]] )<<'\n';
    }

}