Cod sursa(job #1420515)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 18 aprilie 2015 16:43:51
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
// RMQ < NlogN , 1>
// Memorie NlogN
/* RMQ[i][j] = minimul din intervalul [j, j+2^i) */
#include <fstream>
#include <algorithm>
#define LgMax 21
#define Nmax 100009
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int N, Q, v[Nmax];
int lg[Nmax], RMQ[LgMax][Nmax], x, y;

void buildRMQ() {
  for(int i = 2; i <= N; ++i) lg[i] = lg[i/2] + 1;

  for(int j = 1; j <= N; ++j) RMQ[0][j]=v[j]; /* intervale de lungime 1 */


  for(int i=1; (1<<i) <= N; ++i) /* 2^i lungimea intervaluui */
    for(int j = 1; j <= N-(1<<i)+1; ++j) /*capatul stanga */
            RMQ[i][j]= min ( RMQ[ i-1 ][ j ] , RMQ[ i-1 ][ j+(1<<(i-1)) ] );
}

int query(int& x, int& y) {
  if(x > y)swap(x,y);
  int i = lg[y-x+1];
  return min( RMQ[i][x] , RMQ[i][y-(1<<i)+1] );
}

int main()
{
    f >> N >> Q;
    for(int i = 1; i <= N; ++i) f>> v[i];
  
    buildRMQ();

    for(int i = 1; i <= Q; ++i) {
        f >> x >> y;
        g<<query(x, y)<<'\n';
    }
    f.close();g.close();
    return 0;
}