Cod sursa(job #2510494)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 16 decembrie 2019 20:05:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100000;
int v[NMAX + 5] , d[NMAX + 5][25] , n;
void dinamica()
{
    int i , j , lim;
    for(i = 1 ; i <= n ; i ++)
        d[i][0] = i;
    for(j = 1 ; (1 << j) <= n ; j ++)
        for(i = 1 ; i + (1 << j) - 1 <= n ; i ++)
            if(v[d[i][j - 1]] < v[d[i + (1 << (j - 1))][j - 1]])
                d[i][j] = d[i][j - 1];
            else
                d[i][j] = d[i + (1 << (j - 1))][j - 1];
}
int rmq(int x , int y)
{
    int j;
    j = 0;
    while((1 << j) <= y - x + 1)
        j ++;
    j --;
    if(v[d[x][j]] <= v[d[y - (1 << j) + 1][j]])
        return d[x][j];
    return d[y - (1 << j) + 1][j];
}
int main()
{
    freopen("rmq.in" , "r" , stdin);
    freopen("rmq.out" , "w" , stdout);
    int m , i , x , y;
    scanf("%d%d" , &n , &m);
    for(i = 1 ; i <= n ; i ++)
        scanf("%d" , &v[i]);
    dinamica();
    for(i = 1 ; i <= m ; i ++)
    {
        scanf("%d%d" , &x , &y);
        printf("%d\n" , v[rmq(x , y)]);
    }
    return 0;
}