Cod sursa(job #1000630)

Utilizator cahemanCasian Patrascanu caheman Data 23 septembrie 2013 14:50:11
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<cstdio>

using namespace std;

int din[20][100007], vlog[100007];

int main()
{
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  int n, m, i, j, a, b, l, nr;
  scanf("%d %d", &n, &m);
  for(i = 1; i <= n; ++ i)
    scanf("%d", &din[0][i]);
  for(i = 1; (1 << i) <= n; ++ i)
    for(j = 1; j <= n - (1 << i) + 1; ++ j)
    {
      if(din[i-1][j] < din[i-1][j + (1 << (i - 1))])
        din[i][j] = din[i - 1][j];
      else
        din[i][j] = din[i - 1][j + (1 << (i - 1))];
    }
  vlog[1] = 0;
  for(i = 2; i <= n; ++ i)
    vlog[i] = vlog[i >> 1] + 1;
  for(i = 1; i <= m; ++ i)
  {
    scanf("%d %d", &a, &b);
    l = vlog[b - a + 1];
    nr = b - a + 1 - (1 << l);
    if(din[l][a] < din[l][a + nr])
      printf("%d\n", din[l][a]);
    else
      printf("%d\n", din[l][a + nr]);
  }
  return 0;
}