Cod sursa(job #2455694)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 12 septembrie 2019 15:20:48
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#define MaxN 100001
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int v[MaxN], n, m, k, p, i, j, a, b, M[MaxN][20], log[MaxN], Min;
int main()
{   f >> n >> m;
    for(i = 1; i <= n; i++){
        f >> v[i];
        M[i][0] = i;
    }
    for(i = 0; (1 << i) <= n; i++)
        log[(1 << i)] = i;
    for(i = 1; i <= n; i++)
        if(log[i] == 0)
            log[i] = log[i - 1];
    for(j = 1; (1 << j) <= n; j++){
        for(i = 1; i + (1 << j) - 1 <= n; i++){
            if(v[M[i][j - 1]] < v[M[i + (1 << (j - 1))][j - 1]])
                M[i][j] = M[i][j - 1];
            else
                M[i][j] = M[i + (1 << (j - 1))][j - 1];
        }
    }
    for(i = 1; i <= m; i++){
        f >> a >> b;
        Min = MaxN;
        while(a <= b){
            k = log[b - a + 1];
            Min = min(Min, v[M[a][k]]);
            a = a + (1 << k);
        }
        g << Min << '\n';
    }
    return 0;
}