Cod sursa(job #2035933)

Utilizator berindeiChesa Matei berindei Data 9 octombrie 2017 23:08:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int v[100001];
int a[100001][17];
int main(){
    int i, j, n, m, r, log, n1, n2;
    in >> n >> m;
    for (i=1; i<=n; i++){
        in >> v[i];
        a[i][0] = i;
    }
    for (j=1; (1<<j)<=n; j++){
        for (i=1; i<=n-(1<<j) + 1; i++)
            a[i][j] = (v[a[i][j-1]] < v[a[i+(1<<j-1)][j-1]]) ? a[i][j-1] : a[i+(1<<j-1)][j-1];
//        for (; i<=n; i++)
//            a[i][j] = a[i][j-1];
    }
    for (i=1; i<=m; i++){
        in >> n1 >> n2;
        log = log2((double)n2-n1+1);
        r = (v[a[n1][log]] < v[a[n2-(1<<log)+1][log]]) ? a[n1][log] : a[n2-(1<<log)+1][log];
        out << v[r] << '\n';
    }
}