Cod sursa(job #877236)

Utilizator OviTzu24Carabian Ovidiu OviTzu24 Data 12 februarie 2013 18:19:42
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#include<fstream>
#include <vector>
using namespace std;
#define nmax 100010
#define lmax 20
long int rmq[nmax][lmax], n,m, lg[nmax], a[nmax];
int main()
{
   ifstream f("rmq.in");
    ofstream g ("rmq.out");
    long int i,j,l;
    f>>n>>m;
    for (i=1;i<=n;i++)
     f>>a[i];
    rmq[i][0]=i;
   for(int j=1; (1<<j)<=n; j++)
   for(int i=0; i+(1<<j)-1<n; i++)
      if( a[ rmq[i][j-1] ] < a[ rmq[i+(1<<(j-1))][j-1] ] )
         rmq[i][j] = rmq[i][j-1];
      else
         rmq[i][j] = rmq[i+(1<<(j-1))][j-1];        
 
   for(int i=2; i<=n; i++)
      lg[i] = lg[i>>1] + 1;
 
   for(int i=0; i<m; i++) {
      int x, y;
      f >> x >> y;
      x--; y--;
      int k = lg[y-x+1];
 
      g<< min(a[rmq[x][k]], a[rmq[y-(1<<k)+1][k]]) << "\n";
   }
    
   return 0;
}