Cod sursa(job #1657868)

Utilizator ipus1Stefan Enescu ipus1 Data 20 martie 2016 20:59:38
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<cstdio>
long long log[100001],put[20];
long long ma[20][100001];
long long min(long long a, long long b)
    {if(a<=b)
        return a;
    return b;
    }
int main ()
{freopen ("rmq.in","r",stdin);
freopen ("rmq.out","w",stdout);
long long n,i,j,m,x,y,k,q;
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++)
    scanf("%lld",&ma[1][i]);
k=1;
q=0;
for(i=1;i<=k&&i<=100000;i++)
    {log[i]=q;
    if(i==k)
        {put[q]=k;
        k*=2;
        q++;
        }
    }
k=1;
for(i=2;i<=log[n];i++)
    {for(j=1;j<=n-2*k+1;j++)
        ma[i][j]=min(ma[i-1][j],ma[i-1][j+k]);
    k*=2;
    }
for(i=1;i<=m;i++)
    {scanf("%lld%lld",&x,&y);
    if(x>y)
        {k=x;
        x=y;
        y=k;
        }
    k=log[y-x+1];
    printf("%lld\n",min(ma[k][x],ma[k][y-put[k-1]+1]));
    }
return 0;
}