Cod sursa(job #2476286)

Utilizator HannaLieb Hanna Hanna Data 18 octombrie 2019 16:44:41
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 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;

int hatv(int a,int b)
{
    if(b==0) return 1;
    else
    {
        int k=hatv(a,b/2);
        if(b%2==0) return k*k;
        else return k*k*a;
    }
}

void elkeszit()
{
    int l;
    //i+(1<<j)-1
    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);
    //l=min(b,a+(1<<k)+1);
    //m=log2(abs(l-b)+1);
    //if(l+1<<k+1)
    if(x[r[a][k]]<=x[r[b-(1<<k)+1/*lhatv(2,k)*/][k]])
        return r[a][k];
    else return  r[b-(1<<k)+1/*lhatv(2,k)*/][k];
}

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

    elkeszit();

    /*for(i=0;i<n;++i)
    {
        for(j=0;(1<<j)<=n;++j)
        cout<<r[i][j]<<" ";
        cout<<"\n";
    }*/

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

    return 0;
}