Cod sursa(job #2172409)

Utilizator calin1Serban Calin calin1 Data 15 martie 2018 16:22:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define N 100005
#define inf 0x3f3f3f3f

using namespace std;

int n, m, mat[N][20], lg;

void solve()
{

    for(int j = 1 ; j <= lg ; ++j)
    {
        for(int i = 1 ; i + (1 << (j - 1)) <= n; ++i)
        {
            mat[i][j] = min(mat[i][j - 1] , mat[i + (1 << (j - 1))][j - 1]);
        }
    }
}

void init()
{
    for(int i = 0 ; i <= lg + 1 ; ++i)
    {
        for(int j = 0 ; j <= lg + 1 ; ++j)
        {
            mat[i][j] = inf;
        }
    }
}

void citire()
{
    scanf("%d %d\n", &n, &m);

    lg = log2(n);

    init();

    for(int i = 1 ; i <= n ; ++i)
    {
        scanf("%d\n", &mat[i][0]);
    }

    solve();

    int a, b, d;

    for(int i = 1 ; i <= m ; ++i)
    {
        scanf("%d %d\n", &a, &b);

        d = log2(b - a + 1);

        printf("%d\n", min(mat[a][d] , mat[b - (1 << d) + 1][d]));
    }
}

int main()
{
    freopen("rmq.in" , "r" , stdin);
    freopen("rmq.out" , "w" , stdout);

    citire();

    return 0;
}