Cod sursa(job #1357864)

Utilizator ASTELOTudor Enescu ASTELO Data 24 februarie 2015 10:09:07
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<cstdio>
int n,m,d[150005][21],i,j,k,v[100001],log[100001];
int rmq(int st,int dr)
    {
    k=log[dr-st+1];
    if(v[d[st][k]]<=v[d[dr-(1<<k)+1][k]])
        return d[st][k];
    return d[dr-(1<<k)+1][k];
    }
int main ()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
    scanf("%d",&v[i]);
for(j=0;(1<<j)-1<n;j++)
    for(i=0;i+j<n;i++)
        {
        if(j==0)
            d[i][j]=i;
        else
            if(v[d[i+(1<<j-1)][j-1]]>=v[d[i][j-1]])
                d[i][j]=d[i][j-1];
            else
                d[i][j]=d[i+(1<<j-1)][j-1];
        }
log[1]=0;
for(i=2;i<=n;i++)
    log[i]=log[i/2]+1;
for(i=1;i<=m;i++)
    {
    int q,qq;
    scanf("%d%d",&q,&qq);
    printf("%d\n",v[rmq(q-1,qq-1)]);
    }
return 0;
}