Cod sursa(job #2502086)

Utilizator ililogIlinca ililog Data 30 noiembrie 2019 12:58:46
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
using namespace std;
#include<iostream>
#include<fstream>

int st[100001][26], k;

int n, v[100001], logg[100001], m, inc, sf, maxim;

int main() {

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

    fin >> n >> m;

    for (int i = 0; i<n; i++) {
        fin >> v[i];
        st[i][0] = v[i];
        if (maxim < v[i]) {
            maxim = v[i];
        }
    }

    logg[1] = 0;
    for (int i = 2; i<=maxim; i++) {
        logg[i] = logg[i/2]+1;
    }

    k = logg[n];

    for (int j = 1; j<=k; j++){
        for (int i = 0; i+(1<<j)<=n; i++) {
            st[i][j] = min(st[i][j-1], st[i+(1<<(j-1))][j-1]);
        }
    }

    /*for (int i = 0; i<=n; i++) {
        for (int j = 0; j<=k; j++) {
            cout << st[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;*/

    for (int i = 1; i<=m; i++) {
        fin >> inc >> sf;
        inc--;
        sf--;

        int j = logg[sf-inc+1];
        //cout << j << endl;

        fout << min(st[inc][j], st[sf-(1<<j)+1][j]) << endl;
       // cout << inc << " " << j << "   " << sf-(1<<j)+1 << " " << j << endl;
    }



    fin.close();
    fout.close();

    return 0;
}