Cod sursa(job #2763182)

Utilizator Bulboaca_EugenBulboaca Alexandru Eugen Bulboaca_Eugen Data 12 iulie 2021 11:03:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>
#define zeros(x) x & (-x)

using namespace std;

const int MAXN = 25 * 1e4 + 65;
const int INF = 1e8;

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

int rmq[30][MAXN];

int query(int x, int y){

    int dif = y - x + 1;
    int power = 0;

    for(int i = 30; i >= 0; --i){
        if((1 << i) & dif){
            power = i;
            break;
        }
    }
    if(dif == (1 << power)) return rmq[power][x];
    return min(rmq[power][x] , rmq[power][y - (1 << (power)) + 1]);

}

int main(){

    int n, m ; fin >> n >> m;
    for(int i = 1 ; i <= n; ++i){
        fin >> rmq[0][i];
    }

    for(int i = 1; i <= 30; ++i){
        for(int j = 1; j <= n; ++j){
            if(j + (1 << (i - 1)) <= n )
                rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
        }
    }
    for(int i = 1; i <= m; ++ i){
        int x, y; fin >> x >> y;
        fout << query(x , y) << '\n';
    }
    return 0;
}