Cod sursa(job #159896)

Utilizator sealTudose Vlad seal Data 14 martie 2008 15:04:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
#define Nm 100001
#define Lognm 17
#define min(a,b) ((a)<(b)?(a):(b))
int M[Lognm][Nm],Log[Nm],n,m;

void read()
{
    char S[7];
    int i,j;

    freopen("rmq.in","r",stdin);
    scanf("%d%d ",&n,&m);
    for(i=1;i<=n;++i)
    {
        gets(S);
        for(j=0;S[j];++j)
            M[0][i]=M[0][i]*10+S[j]-'0';
    }
}

void compute_rmq()
{
    int i,j,cnt;

    for(cnt=2,i=1;cnt<=n;++i,cnt<<=1)
        for(j=1;j<=n-cnt+1;++j)
            M[i][j]=min(M[i-1][j],M[i-1][j+(cnt>>1)]);

    for(i=2;i<=n;++i)
        if(1<<Log[i-1]+1==i)
            Log[i]=Log[i-1]+1;
        else
            Log[i]=Log[i-1];
}

void write()
{
    char S[14];
    int a,b,i;

    freopen("rmq.out","w",stdout);
    while(m--)
    {
        gets(S);
        for(a=i=0;S[i]!=' ';++i)
            a=a*10+S[i]-'0';
        for(b=0,++i;S[i];++i)
            b=b*10+S[i]-'0';
        i=Log[b-a+1];
        printf("%d\n",min(M[i][a],M[i][b-(1<<i)+1]));
    }
}

int main()
{
    read();
    compute_rmq();
    write();
    return 0;
}