Cod sursa(job #1389461)

Utilizator iarbaCrestez Paul iarba Data 16 martie 2015 11:52:15
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
using namespace std;
int n,t,i,a[100001],m[100001][19],k,j,r,rez;
int power2 (int x){return 1<<x;}
int log2 (int x)
{
    int y=0;
    while (x){x/=2; y++;}
    return y-1;
}
int main ()
{
    freopen ("rmq.in","r", stdin);
    freopen ("rmq.out","w", stdout);
    scanf("%d%d",&n,&t);
    for (i=1; i <=n; i++)
    {
        scanf ("%d",&a [i]);
        m[i][0]=i;
    }
    k=log2 (n);
    for (j=1; j<=k; j++)
    {
        r=power2 (j);
        for (i=1; i <=n-r+1; i++)
        {
            if(a[m[i][j-1]]<a[m[i+r/2][j-1]]){m[i][j]= m[i][j-1];}
            else{ m[i][j]= m[i+r/2][j-1];}
        }
    }
    while (t--)
    {
        scanf ("%d%d",&i,&j);
        k=log2 (j-i+1); r=power2 (k);
        if (a [m [i][k]]<a [m[j-r+1][k]]){rez=m[i][k];}
        else {rez=m[j-r+1][k];}
        printf ("%d\n", a[rez]);
    }
return 0;
}