Cod sursa(job #2278042)

Utilizator FlaviusFeteanFetean Flavius FlaviusFetean Data 7 noiembrie 2018 10:40:59
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int T[25][100005];

int main()
{
    int n, m, i, j, k, a, b, d, l = 0, r = 31, mij;

    fin >> n >> m; k = j = 1;
    for(i = 1; i <= n; i++) fin >> T[0][i];

    while(k <= n){
        for(i = 1; i <= n; i++){
            if(T[j - 1][i + k] == 0){T[j][i] = T[j - 1][i]; continue;}
            T[j][i] = min(T[j - 1][i], T[j - 1][i + k]);
        }
        j++, k *= 2;
    }

    for(i = 1; i <= m; i++){
        fin >> a >> b; d = b - a + 1;
        n = d;l = 0; r = 31;
        while(l < r){
            mij = (l + r) >> 1;
            if(n >> mij == 1) break;
            if(n >> mij == 0) r = mij;
            else l = mij;
        }
        fout << min(T[mij][a], T[mij][a + (d - (1 << mij))]) << "\n";
    }

    return 0;
}