Cod sursa(job #1897670)

Utilizator calin1Serban Calin calin1 Data 1 martie 2017 17:06:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define N 100005

using namespace std;

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

void prelucrare()
{
    int tmp;

    for(int j = 1 ; j <= lg_n ; ++j)
    {
        for(int i = 0 ; i < n ; ++i)
        {
            tmp = i + (1 << (j - 1));

            if(tmp < n)
            {
                mat[i][j] = min(mat[i][j - 1] , mat[tmp][j - 1]);
            }
            else
            {
                mat[i][j] = mat[i][j - 1];
            }
        }
    }
}

void afisare()
{
    for(int i = 0 ; i < n ; ++i)
    {
        for(int j = 0 ; j <= lg_n ; ++j)
        {
            printf("%d ",mat[i][j]);
        }

        printf("\n");
    }
}

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

    lg_n = log2(n);

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

    prelucrare();

    //afisare();

    int x, y, j;

    for(int i = 0 ; i < m ; ++i)
    {
        scanf("%d %d\n", &x , &y);

        x--;
        y--;

        j = log2(y - x + 1);

        printf("%d\n",min(mat[x][j] , mat[y - (1 << j) + 1][j]));
    }
}

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

    citire();

    return 0;
}