Cod sursa(job #3134089)

Utilizator barzoiusBarzoius barzoius Data 28 mai 2023 14:23:31
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>

int RMQ[16][100005];

void R_M_Q( std::vector<int>& v, int num_of_elements)
{
    for (int i = 0; i < v.size(); i++) { RMQ[0][i] = v[i]; }

    for (int i = 1; (1 << i) <= num_of_elements; i++){
        for (int j = 0; j + (1 << i) - 1 <= num_of_elements; j++)
        {
            RMQ[i][j] = std::min(RMQ[i - 1][j], RMQ[i - 1][j + (1 << (i - 1))]);
        }
    }
}

int main()
{
    std::ifstream fin("rmq.in");

    int num_of_elements;
    int num_of_queries;
    fin >> num_of_elements >> num_of_queries;
    std::vector <int> v;
    for (int i = 0; i < num_of_elements; i++)
    {
        int ele;
        fin >> ele;
        v.push_back(ele);
    }

    R_M_Q(v, num_of_elements);

    std::ofstream fout("rmq.out");
    for (int i = 1; i <= num_of_queries; i++){
        int dr, st;
        fin >> st >> dr;
        st--;
        dr--;
        int p = 31 - __builtin_clz(dr - st + 1);
        fout << std::min(RMQ[p][st], RMQ[p][dr - (1 << p) + 1]) << std::endl;
    }

    fin.close();
    fout.close();

    return 0;
}