Cod sursa(job #3041779)

Utilizator sipdavSipos David Oliver sipdav Data 1 aprilie 2023 15:14:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>

#define MAX_N 100000

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

int n, m, log[MAX_N + 1], v[MAX_N + 1];
int rmq[MAX_N + 1][100];

void precalc()
{
    for(int i = 2;i <= n;i++)
        log[i] = log[i >> 1] + 1;
    for(int i = 1;i <= n;i++)
        rmq[i][0] = i;
    for(int j = 1; (1 << j) <= n;j++)
    {
        for(int i = 1;i + (1 << j) - 1 <= n;i++)
        {
            if(v[rmq[i][j - 1]] <= v[rmq[i + (1 << (j - 1))][j - 1]])
                rmq[i][j] = rmq[i][j - 1];
            else
                rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
        }
    }
}

int main()
{
    in>>n>>m;
    for(int i = 1;i <= n;i++)
        in>>v[i];
    precalc();
    for(int i = 1;i <= m;i++)
    {
        int a, b;
        in>>a>>b;
        int l = log[b - a + 1];
        if(v[rmq[a][l]] <= v[rmq[b - (1 << l) + 1][l]])
            out<<v[rmq[a][l]]<<'\n';
        else
            out<<v[rmq[b - (1 << l) + 1][l]]<<'\n';
    }
    in.close();
    out.close();
    return 0;
}