Cod sursa(job #2112122)

Utilizator omegasFilip Ion omegas Data 23 ianuarie 2018 00:47:45
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>

using namespace std;
int v[100001][17];
int a[100001];
int pow[17];



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

int log(int a){
    int ans=0;
    int k=1;
    while(a - k >= k)
        k=k<<1,
        ++ans;
    return ans;
}

int minim(int a,int b){
if(a > b)
    return b;
else
    return a;
}

void init(int n){

    int i,j,t;

    for(j=1;j<=n;++j)
        v[j][0] = j;
    t = log(n);


    for(i=1;i<=t;++i)
       for(j=1;j<=n - pow[i] + 1;++j)
            if(a[v[j][i-1]]<a[v[j + pow[i - 1]][i-1]])
                v[j][i] = v[j][i - 1];
            else
                v[j][i] = v[j + pow[i - 1]][i-1];
}

int main()
{
    int n,m,i,x,y,l,p,q;
    fin >> n >> m;
    for(i=1;i<=n;++i)
        fin >> a[i];
    pow[0]=1;
    for(i=1;i<=17;++i)
        pow[i]=pow[i-1]<<1;

    init(n);

    for(i=1;i<=m;++i){
        fin >> x >> y;
        l = y - x + 1;

        q = log(l);
        p = pow[q];

        fout << minim(a[v[x][q]],a[v[y - p + 1][q]]) << '\n' ;
    }


    return 0;
}