Cod sursa(job #2617079)

Utilizator stanciucalinStanciu Calin stanciucalin Data 20 mai 2020 18:12:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int powers_of_2[31];
int sparse_table[18][100005];

int n, m;

void powgen(){

    powers_of_2[0] = 1;

    for(int i = 1; i < 31; i++)
        powers_of_2[i] = 2 * powers_of_2[i - 1];
}

int get_log(int x){

    int s = 1, d = 31;

    while(s < d){

        int m = s + (d - s) / 2;

        if(powers_of_2[m] <= x){

            s = m + 1;
        }
        else{

            d = m;
        }
    }

    if(powers_of_2[d] == x)
        return d;

    return d - 1;
}

int main(){

    powgen();

    f>>n>>m;

    int maxp = get_log(n);

    for(int i = 0; i < n; i++){

        f>>sparse_table[0][i];
    }

    for(int p = 1; p <= maxp; p++)
        for(int i = 0; i < n - (1 << p) + 1; i++){

            sparse_table[p][i] = min(sparse_table[p - 1][i], sparse_table[p - 1][i + (1 << (p - 1))]);
        }

    int a, b;
    int paux;

    for(int i = 0; i < m; i++){

        f>>a>>b;

        b -= 1;
        a -= 1;     ///am urmat indexarea de la 0, nu de la 1

        paux = get_log(b - a + 1);

        g<<min(sparse_table[paux][b - (1 << paux) + 1], sparse_table[paux][a])<<'\n';
    }

    return 0;
}