Cod sursa(job #2626328)

Utilizator StefanaArinaStefana Arina Tabusca StefanaArina Data 6 iunie 2020 13:30:29
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#define lim 100002

using namespace std;

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

int n, m, v[lim], x, y, M[lim][18], lg[lim], l;

int main()
{
    f >> n >> m;
    for (int i = 0; i < n; i++)
        f >> v[i];
        
    for (int i = 0; i < n; i++)
        M[i][0] = i;
        
    for (int j = 1; (1 << j) <= n; j++)
        for (int i = 0; i + (1 << j) - 1 < n; i++)
            if (v[M[i][j - 1]] < v[M[i + (1 << (j - 1))][j - 1]])
                M[i][j] = M[i][j - 1];
            else M[i][j] = M[ i + (1 << (j - 1))][j - 1];
            
    lg[1] = 0;
    for (int i = 2;i < n; i ++)
        lg[i] = lg[i / 2] + 1;
        
    for (int k = 0; k < m; k++)
    {
        f >> x >> y;
        --x;
        --y;
        l=lg[y - x + 1];
        g << min(v[M[x][l]], v[M[y - (1 << l) + 1][l]]) << '\n';
    }
    
    f.close();
    g.close();
    return 0;
}