Cod sursa(job #2739555)

Utilizator CronosClausCarare Claudiu CronosClaus Data 8 aprilie 2021 17:48:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>
#define pp pair< int, int >

using namespace std;

const int mxn = 100 * 1000 + 10;
const int mxm = 20;

int n, m;

int rmq[ mxm ][ mxn ];

inline int minInterval(int x, int y){
    int nr = 0;
    int dist = y - x + 1;
    int dist1 = y - x + 1;
    while(dist){
        dist /= 2;
        nr++;
    }
    nr--;
    dist = (1 << nr);
    return min(rmq[ nr ][ x - 1 ], rmq[ nr ][ x - 1 + (dist1 - dist)]);

}

int main()
{
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");

    cin>> n >> m;

    for(int i = 0; i < n; i++){
        cin>>rmq[ 0 ][ i ];
    }
    for(int i = 1; (1 << i) < n; i++){
        int x = (1 << i);
        for(int j = 0; j + x <= n; j++){
            rmq[ i ][ j ] = min(rmq[ i - 1 ][ j ], rmq[ i - 1 ][ j + x/2 ]);
        }
    }

    for(int i = 0, x, y; i < m; i++){
        cin>> x >> y;
        cout<< minInterval(x, y ) << '\n';
    }

    return 0;
}