Cod sursa(job #972037)

Utilizator dan_tudorDan Tudor dan_tudor Data 10 iulie 2013 20:47:19
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;
#define MAXN 100005
int     RMQ[20][MAXN<<1], Lg[MAXN], a[MAXN], n, m;

int Query(int x, int y){
      int diff = y - x + 1;
     int l = Lg[diff];
     int sh = diff - ( 1<<l );
       int Ans = RMQ[l][x];
      if(a[Ans] > a[RMQ[l][x+sh]])
        Ans = RMQ[l][x+sh];
     return a[Ans];
}

inline void Build_RMQ(){
      for(int i = 1 ; i <= n ; ++ i)
          RMQ[0][i] = i;
     for(int i = 1 ; (1<<i) <= n ; ++ i)
           for(int j = 1 ; j <= n - ( 1 << i ) ; ++ j){
             int l = 1<<(i-1);
             if(a[RMQ[i-1][j]] > a[RMQ[i-1][j+l]])
                  RMQ[i][j] = RMQ[i-1][j+l];
             else RMQ[i][j] = RMQ[i-1][j];
            }
}
inline void Build_Log(){
     for(int i = 2 ; i <= n ; ++ i)
          Lg[i] = Lg[(i>>1)] + 1;
}
int main() {
     ifstream in("rmq.in");
      ofstream out("rmq.out");
       in >> n >> m;
     for(int i = 1 ; i <= n ; ++ i)
         in >> a[i];
    Build_Log();
    Build_RMQ();
     for(int i = 1 ; i <= m ; ++ i){
        int x, y;
         in >> x >> y;
          out << Query(x, y) << "\n";
    }
    in.close();
    out.close();
    return 0;
}