Cod sursa(job #1956897)

Utilizator andytosaAndrei Tosa andytosa Data 7 aprilie 2017 09:47:08
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
#include <iostream>

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

int log[100010], d[17][100010], n, m, x, y;
int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; ++i)
        fin >> d[0][i];

    for(int i = 2; i <= n; ++i)
        log[i] = log[i / 2] + 1;

    for(int i = 1; i <= log[n]; ++i)
        for(int j = 1; j <= n; ++j)
            d[i][j] = 999999;

    for(int i = 1; i <= log[n]; ++i){
        for(int j = 1; j + (1 << (i)) - 1 <= n; ++j){
            d[i][j] = min(d[i - 1][j], d[i - 1][j + (1 << ( i - 1 ))]);
            //cout << d[i][j] << ' ';
        }
        //cout << '\n';
    }

    for(int q = 1; q <= m; ++q){
        fin >> x >> y;
        int k = log[y - x + 1];
        fout << min(d[k][x], d[k][y - (1 << k) + 1]) << '\n';
    }

    return 0;
}