Cod sursa(job #2480325)

Utilizator HannaLieb Hanna Hanna Data 25 octombrie 2019 12:36:17
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.81 kb
#include <fstream>
#include <math.h>
#include <stdlib.h>

using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

int x[100005],n,m,i,r[100005][20],j,a,b;

void elkeszit()
{
    int l;
    for(i=0;i<n;++i) r[i][0]=i;

    for(j=1;(1<<j)<=n;++j)
    for(i=0;i<n;++i)
    {
        l=min(n-1,i+(1<<(j-1)));
        if(x[r[i][j-1]]<x[r[l][j-1]])
        r[i][j]=r[i][j-1];
        else r[i][j]=r[l][j-1];
    }

}

int rmq(int a, int b)
{
    int k,l,m;
    k=log2(b-a+1);
    if(x[r[a][k]]<=x[r[b-(1<<k)+1][k]])
        return r[a][k];
    else return  r[b-(1<<k)+1][k];
}

int main()
{
    cin>>n>>m;
    for(i=0;i<n;++i)
    cin>>x[i];

    elkeszit();

    for(i=1;i<=m;++i)
    {
        cin>>a>>b;
        cout<<x[rmq(a-1,b-1)]<<"\n";
    }

    return 0;
}