Cod sursa(job #2341714)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 12 februarie 2019 10:05:33
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>
#define NMAX 100000
#define LOGMAX 20

using namespace std;

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

int main() {
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n, m, i, j, k, a, b;
    scanf("%d%d",&n,&m);
    for( i = 0; i < n; i ++ ) {
      scanf("%d",&v[i]);
      M[i][0] = i;
    }
    for( j = 1; (1 << j) <= n; j ++ )
      for( i = 0; i + (1<<j) - 1 < 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];
      }
    for( i = 1; i <= m; i ++ ) {
      scanf("%d%d",&a,&b);
      a --;
      b --;
      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]]);
    }
    return 0;
}