Cod sursa(job #2755371)

Utilizator XeinIonel-Alexandru Culea Xein Data 27 mai 2021 00:21:10
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

std::ifstream f("rmq.in");
std::ofstream g("rmq.out");

const int MAXLOGN = 20;

int main()
{
    int N, M;
    f >> N >> M;
    int Vector[N], RMQ[10][N];
    for(int i = 0; i < N; ++i)
        f >> Vector[i];

    for(int i = 0; i < N; ++i)
        RMQ[0][i] = Vector[i];
    for(int putere = 2, i = 1; putere <= N; putere *= 2, ++i)
        for(int j = 0; j <= N - putere + 1; ++j)
            if(j == N - putere + 1)
                RMQ[i][j] = RMQ[i-1][j];
            else
                RMQ[i][j] = std::min(RMQ[i-1][j], RMQ[i-1][j + putere / 2]);

    for(int x, y, i = 0; i < M; ++i)
    {
        f >> x >> y;

        int Minim = 100001;
        int Putere = 1;
        int Range = y - x + 1;

        while(Putere * 2 < Range)
            Putere *= 2;

        while(Putere != 0)
        {
            if(Putere <= Range)
            {
                Minim = std::min(Minim, RMQ[Putere - 1][x - 1]);
                x += Putere;
                Range -= Putere;
            }
            Putere /= 2;
        }
        g << Minim << '\n';
    }
    return 0;
}