Cod sursa(job #2412165)

Utilizator vladth11Vlad Haivas vladth11 Data 21 aprilie 2019 18:40:32
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <iomanip>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int sparse[18][100001];
int n,m,i,j;
int v[100001],logs[100001];
void precalc(){
    logs[1] = 0;
    for(i = 2;i <= n;i++){
        logs[i] = logs[i / 2] + 1;
    }
}
void build(){
    for(i = 0;i <= logs[n];i++){
        int lungime = 1 << i;
        for(j = 0;j + lungime <= n + 1;j++){
            if(lungime!=1)
            sparse[i][j] = min(sparse[i-1][j],sparse[i-1][j + lungime / 2]);
            else sparse[i][j] = v[j];
        }
    }
    sparse[0][n] = v[n];
}
int getmin(int l,int r){
     int len = r - l + 1;
     int lungime = 1 << logs[len];
     return min(sparse[logs[len]][l],sparse[logs[len]][r - lungime + 1]);
}
int main()
{
    int i;
    cin >> n >> m;
    for(i = 1;i <= n;i++){
        cin >> v[i];
    }
    precalc();
    build();
    while(m--){
        int l,r;
        cin >> l >> r;
        cout << getmin(l,r) << "\n";
    }
    return 0;
}