Cod sursa(job #1765305)

Utilizator enouGhAbu Ras Mohamed Ata Radu enouGh Data 26 septembrie 2016 16:50:53
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<bits/stdc++.h>
using namespace std;

int v[100010];
int M[100010][19];
int n, m, x, y, k;

int compute(int x , int y)
{
    int el = log2( y - x + 1);

    if(v[ M[ x ][ el ] ] <= v[ M[ y - (1<<k) + 1][ k ] ] )
        return v[ M[ x ][ k ] ];
    else
        return v[ M[ y - (1<<k) + 1][ k ] ];
}

int main()
{
    ifstream in("rmq.in");
    ofstream out("rmq.out");

    in >> n >> m;

    for(int i = 0; i < n; i++)
    {
        in >> v[i];
        M[i][0] = i;
    }

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

    for (int i = 0; i < m ; i++)
    {
        in >> x >> y;
        x--;y--;

        out<<compute(x , y) << '\n';
    }
    return 0;
}