Cod sursa(job #998727)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 17 septembrie 2013 21:31:38
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<stdio.h>
#include<math.h>
int d[30][100005],v[100005],p[30];
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,m,i,j,l,a,b,c;
scanf("%d%d",&n,&m);
 scanf("%d",&v[1]);
for(i=2;i<=n;i++)
{
    scanf("%d",&v[i]);
    if(v[i]<v[i-1])
    d[i-1][0]=v[i];
    else
        d[i-1][0]=v[i-1];
}
l=log2(n);
p[0]=1;
for(j=1;j<=l;j++)
{
    p[j]=p[j-1]*2;
for(i=1;i<=n-p[j];i++)
{
    d[i][j]=d[i][j-1];
    if(d[i+p[j-1]][j-1]<d[i][j])
        d[i][j]=d[i+p[j-1]][j-1];
}
}
for(i=1;i<=m;i++)
{
    scanf("%d%d",&a,&b);
    if(a==b)
        printf("%d\n",v[a]);
    else
    {
    c=log2(b-a);
    if(d[a][c]<d[b-p[c]][c])
        printf("%d\n",d[a][c]);
    else
        printf("%d\n",d[b-p[c]][c]);
    }
}
    return 0;
}