Cod sursa(job #827673)

Utilizator ericptsStavarache Petru Eric ericpts Data 2 decembrie 2012 14:08:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <cstdio>
using namespace std;
int n,m;
int v[100005];
inline int min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
int rmq[100005][18];
void makem()
{
    int i,j;
    for(i=0;i<n;++i)
        rmq[i][0] = v[i];
    for(j=1;(1<<j) <= n;++j)
        for(i=0;i + (1<<j)-1< n;++i)
            rmq[i][j] = min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
int query(int a,int b)
{
    int k;
    for(k=0;(1<<k)<=(b-a+1);++k);
    --k;
    return min(rmq[a][k],rmq[b-(1<<k)+1][k]);
}
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d %d",&n,&m);
    int i,j;
    for(i=0;i<n;++i)
        scanf("%d",v+i);
    makem();
    while(m--)
    {
        scanf("%d %d",&i,&j);
        printf("%d\n",query(i-1,j-1));
    }
    return 0;
}