Cod sursa(job #3134083)

Utilizator barzoiusBarzoius barzoius Data 28 mai 2023 14:18:13
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <vector>
std::vector<std::vector<std::vector<int>>> RMQ(16, std::vector<std::vector<int>>(100005));

void R_M_Q( std::vector<int>& v, int num_of_elements)
{
    for (int i = 0; i < v.size(); i++) { RMQ[0][i].push_back(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].push_back(std::min(RMQ[i - 1][j][0], RMQ[i - 1][j + (1 << (i - 1))][0]));
        }
    }
}

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][0], RMQ[p][dr - (1 << p) + 1][0]) << std::endl;
    }

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

    return 0;
}