Cod sursa(job #754586)

Utilizator visanrVisan Radu visanr Data 2 iunie 2012 17:43:13
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

int M[100000][17], n, m, A[100000];

int process()
{
    int i, j;
    for(i = 0; i < n; i++) M[i][0] = i;
    for(j = 1; (1 << j) <= n; j++)
    {
          for(i = 0; i + (1 << j) - 1 < n; i++)
          {
                if(A[M[i][j - 1]] < A[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];
                }
          }
    }
}
    

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int i, x, y, k;
    scanf("%i %i", &n, &m);
    for(i = 0; i < n; i++) scanf("%i", &A[i]);
    process();
    for(i = 0; i < m; i++)
    {
          scanf("%i %i", &x, &y);
          x--; y--;
          k = (int)log2(y - x + 1);
          if(A[M[x][k]] <= A[M[y - (1 << k) + 1][k]]) printf("%i\n", A[M[x][k]]);
          else printf("%i\n", A[M[y - (1 << k) + 1][k]]);
    }
    scanf("%i", &i);
    return 0;
}