Cod sursa(job #2455696)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 12 septembrie 2019 15:23:25
Problema Range minimum query Scor 100
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];
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;
        k = log[b - a + 1];
        if(v[M[a][k]] < v[M[b - (1 << k) + 1][k]])
            g << v[M[a][k]];
        else
            g << v[M[b - (1 << k) + 1][k]];
        g << '\n';
    }
    return 0;
}