Cod sursa(job #998580)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 17 septembrie 2013 17:58:50
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int dp[20][100005];

int l2(int x){
  int nr = 0;
  while(x){
    ++nr;
    x >>= 1;
  }
  return nr - 1;
}

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

  int n, m;
  scanf("%d%d", &n, &m);

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

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

  for(int i = 1; i <= m; ++i){
    int x, y;
    scanf("%d%d", &x, &y);
    int lp = l2(y - x);
    printf("%d\n", min(dp[lp][x], dp[lp][y - (1 << lp) + 1]));
  }

  return 0;
}