Cod sursa(job #2763173)

Utilizator Bulboaca_EugenBulboaca Alexandru Eugen Bulboaca_Eugen Data 12 iulie 2021 10:36:26
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 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];
/// rmq[i][j]
/// cel mai mare element din intervalul (j , j + 1 << i - 1)

int query(int x, int y){

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

    for(int i = 24; 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][x + (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;
}