Cod sursa(job #2903264)

Utilizator ScoveargaIlie Andrei-Virgil Scovearga Data 17 mai 2022 12:10:22
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
#include <math.h>

//https://www.topcoder.com/thrive/articles/Range%20Minimum%20Query%20and%20Lowest%20Common%20Ancestor

using namespace std;

int i,j, A[100000], M[10000000][20], st, dr, n, m, aux;
ifstream f("rmq.in");
ofstream g("rmq.out");

int main()
{
    f>>n>>m;
    for(i = 0; i < n ; ++i)
        f>>A[i];
    for(i = 0; i < n; ++i)
        M[i][0] = i;
    for (j = 1; 1 << j <= n; ++j)
        for (i = 0; i + (1 << j) - 1 < n; ++i)
            if (A[M[i][j - 1]] < A[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 = 0; i < m; ++i)
    {
        f>>st>>dr;
        st--;
        dr--;
        aux = floor(log2(dr - st + 1));
        if(A[M[st][aux]] <= A[M[dr - (1 << aux) + 1][aux]])
            g<<A[M[st][aux]]<<"\n";
        else
            g<<A[M[dr - (1 << aux) + 1][aux]]<<"\n";
    }
    return 0;
}