Cod sursa(job #1771949)

Utilizator DenisacheDenis Ehorovici Denisache Data 6 octombrie 2016 11:27:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100005
#define LMAX 18

int n,RMQ[LMAX][NMAX],m,v[NMAX],lg[NMAX];

int ans(int a,int b)
{
        int diff=b-a+1,l=lg[diff], sh=diff-(1<<l);
        return min(v[RMQ[l][a]],v[RMQ[l][a+sh]]);
}

int main()
{
        freopen("rmq.in","r",stdin);
        freopen("rmq.out","w",stdout);
        scanf("%d %d",&n,&m);
        for (int i=1;i<=n;i++)
        {
                scanf("%d",&v[i]);
                RMQ[0][i]=i;
                if (i>1) lg[i]=lg[i>>1]+1;
        }
        for (int i=1;(1<<i)<=n;i++)
        {
                for (int j=1;j<=n-(1<<i)+1;j++)
                {
                        int l=1<<(i-1);
                        if (v[RMQ[i-1][j]]<v[RMQ[i-1][j+l]])
                                RMQ[i][j]=RMQ[i-1][j];
                        else RMQ[i][j]=RMQ[i-1][j+l];
                }
        }
        int a,b;
        while (m--)
        {
                scanf("%d %d",&a,&b);
                printf("%d\n",ans(a,b));
        }
        return 0;
}