Cod sursa(job #1403213)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 27 martie 2015 09:27:48
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
#define nmax 100005

using namespace std;

int n, m;
int EXP[nmax];
int Min[17][nmax];

void preprocess()
{
    EXP[1] = 0;
    for (int i = 2; i <= n; i++)
        EXP[i] = 1 + EXP[i/2];
    
    for (int i = 1; i <= EXP[n]; i++)
        for (int j = 1; j <= n - (1<<i) + 1; j++)
        {
            int st = j;
            int dr = j + (1<<i) - 1;
            int mid = dr - (1<<(i-1)) + 1;
            Min[i][j] = min(Min[i-1][st], Min[i-1][mid]);
        }
    
}

int main()
{
    
    ifstream fi("rmq.in");
    ofstream fo("rmq.out");
    
    fi >> n >> m;
    for (int i = 1; i <= n; i++)
        fi >> Min[0][i];
    
    preprocess();
    
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        fi >> x >> y;
        
        int len = (y - x + 1);
        int k = EXP[len];
        
        int minim = Min[k][x];
        minim = min(minim, Min[k][y-(1<<k)+1]);
        
        fo << minim << "\n";
        
    }
    
    fi.close();
    fo.close();
    
    return 0;
}