Cod sursa(job #2455691)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 12 septembrie 2019 15:06:17
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int v[100001], n, m, k, p, i, j, a, b, M[100001][20], log[100001];
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];
        p = log[b - a - (1 << k) + 1];
        if(v[M[a][k]] < v[M[a + (1 << k)][p]])
            g << v[M[a][k]];
        else
            g << v[M[a + (1 << k)][p]];
        g << '\n';
    }
    return 0;
}