Cod sursa(job #2184991)

Utilizator AndreiSorin26012001Cirpici Andrei Sorin AndreiSorin26012001 Data 24 martie 2018 12:27:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <bits/stdc++.h>
#include <stdio.h>

using namespace std;

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

int n, m, a, b, p;
int arr[100005];

int d[18][100005];
int putere[100005];

int main()
{
    in>>n>>m;
    for( int i = 1; i <= n; i++ )
        in>>arr[i];

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

    for( int i = 1; i <= n; i++ )
        d[0][i] = arr[i];

    for( int i = 1; (1<<i) <= n; i++ )
        for( int j = 1; j <= n; j++ )
            if( j + (1<<i) - 1 <= n )
                d[i][j] = min( d[i - 1][j], d[i - 1][ j + (1<<(i-1))] );
            else
                d[i][j] = d[i - 1][j];

    for( int i = 1; i <= m; i++ )
    {
        in>>a>>b;

        p = putere[ b - a + 1 ];
        out<<min( d[p][a], d[p][ b - (1<<p) + 1 ] )<<"\n";
    }

}