Cod sursa(job #161483)

Utilizator cretuMusina Rares cretu Data 18 martie 2008 11:48:46
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#define NMAX 100002  
#define LMAX 18  
#define mini(a, b) ((a) < (b) ? (a) : (b))

using namespace std;
  
long int rmq[LMAX][NMAX];  
long int n, m;  
long int lg[NMAX];  
long int a[NMAX];  

int main()
{
    long long i, j, l;
    
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    
    fin >> n >> m;
    for (i = 1; i <= n; i++)    
        fin >> a[i];
    
    lg[1] = 0;
    for (i = 2; i <= n; i++)
        lg[i] = lg[i/2] + 1;
     
    for (i = 1; i <= n; i++)    
        rmq[0][i] = a[i];
    
    for (i = 1; (1 << i) <= n; i++)  
        for (j = 1; j <= n-(1 << i)+1; j++)  
        {  
             l = 1<<(i-1);  
             rmq[i][j] = mini(rmq[i-1][j], rmq[i-1][j+l]);  
        }  
    
    long long x, y, d, s;
    
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y;
        d = y-x+1;
        l = lg[d];
        s = d - (1<<l);  
        fout << mini(rmq[l][x], rmq[l][x+s]) << "\n";    
    }
    
    fin.close();
    fout.close();
    
    return 0;
}