Cod sursa(job #532106)

Utilizator icepowdahTudor Didilescu icepowdah Data 10 februarie 2011 20:26:00
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
using namespace std;
#define NMAX 100001
#define LOGMAXN 17

int N, M, A[NMAX], mins[LOGMAXN][NMAX];
ifstream f("rmq.in"); ofstream g("rmq.out");

void preprocesare() {
  for (int i=1;i<=N;i++) mins[0][i] = i;
  for (int j=1;1<<j<=N;j++)
    for (int i=1;i+(1<<j)-1<=N;i++)
      if (A[mins[j-1][i]] < A[mins[j-1][i+(1<<(j-1))]])
        mins[j][i] = mins[j-1][i];      
      else mins[j][i] = mins[j-1][i+(1<<(j-1))];
}

int main() {
  int i,j,k,x,dif;
  f>>N>>M;
  for (i=1;i<=N;i++) f>>A[i];
  preprocesare();
  for (x=1;x<=M;x++) {
    f>>i>>j;
    dif = j-i+1, k=0;
    for (k=0;dif;dif>>=1,k++); k--;
    if (A[mins[k][i]]<A[mins[k][j-(1<<k)+1]]) g<<A[mins[k][i]]<<"\n";
    else g<<A[mins[k][j-(1<<k)+1]]<<"\n";
  }
  f.close(); g.close(); return 0;
}