Cod sursa(job #2819507)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 18 decembrie 2021 14:55:09
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

const int MAXN = 100000;
const int MAX_LOG = 16;

int v[MAXN];
int table[MAXN][MAX_LOG];

int f( int a, int b ){
  return min(a, b);
}

void buildTable( int n ){
  int p, i, pow;

  for( i = 0; i < n; i++ )
    table[i][0] = v[i];

  for( p = 1; p <= MAX_LOG; p++ ){
    pow = 1 << p;
    //out<<"putere: "<<p<<" ";
    for( i = 0; i + pow - 1 < n; i++ ){
      table[i][p] = f(table[i][p - 1], table[i + (1 << (p - 1))][p - 1]);
      //out<<table[i][p]<<" ";
    }
  }

}

int log_two( int a ){
  int p;

  p = 0;
  while(a > 1){
    p++;
    a /= 2;
  }

  return p;
}

int query( int x, int y ){
  int a;

  a = log_two((y - x) + 1);
  //out<<x<<" "<<y<<" "<<a<<'\n';

  return f(table[x][a], table[y - (1 << a) + 1][a]);
}

int main(){
  int n, m, i, x, y;
  in>>n>>m;

  for( i = 0; i < n; i++ ){
    in>>v[i];
  }

  buildTable(n);

  for( i = 0; i < m; i++ ){
    in>>x>>y;
    out<<query(x - 1, y - 1)<<'\n';
  }
  return 0;
}