Cod sursa(job #2372576)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 7 martie 2019 09:59:24
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include <cmath>
#define NMAX 100000
#define LOGMAX 20

using namespace std;

int v[NMAX], M[NMAX][LOGMAX], n;

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

void querry(int a, int b) {
  a --;
  b --;
  int k = log2(b - a + 1);
  if( v[M[a][k]] < v[M[b-(1<<k)+1][k]] )
    printf("%d\n",v[M[a][k]]);
  else
    printf("%d\n",v[M[b-(1<<k)+1][k]]);
}

int main() {
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int i, m;
    scanf("%d%d",&n,&m);
    for( i = 0; i < n; i ++ ) {
      scanf("%d",&v[i]);
      M[i][0] = i;
    }
    build_RMQ();
    for( i = 1; i <= m; i ++ ) {
      int a, b;
      scanf("%d%d",&a,&b);
      querry(a,b);
    }
    return 0;
}