Cod sursa(job #2348621)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 19 februarie 2019 20:51:22
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int LOGMAX = 20;
const int NMAX = 100005;

int N, M;
int lg[NMAX];
vector <int> rmq[LOGMAX];

void InitLog()
{
    for(int i = 2; i <= NMAX - 5; i++)
        lg[i] = lg[i / 2] + 1;
}

void BuildRMQ()
{
    for(int i = 1; i <= LOGMAX; i++)
    {
        if((1 << i) > N)
            break;

        for(int j = 0; j < N; j++)
        {
            if((1 << i) + j - 1 > N)
                break;

            rmq[i].push_back(min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]));
        }
    }
}

int QueryRMQ(int x, int y)
{
    int lenght = y - x  + 1;
    int k = lg[lenght];

    return min(rmq[k][x], rmq[k][y - (1 << k) + 1]);
}

int main()
{
    int x, y;

    fin >> N >> M;

    for(int i = 1; i <= N; i++)
    {
        fin >> x;
        rmq[0].push_back(x);
    }

    InitLog();
    BuildRMQ();

    for(int i = 1; i <= M; i++)
    {
        fin >> x >> y;
        fout << QueryRMQ(x - 1, y - 1) << '\n';
    }

    return 0;
}