Cod sursa(job #883483)

Utilizator timicsIoana Tamas timics Data 20 februarie 2013 03:14:13
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
int N,M,b,c,d;
int mi(int x,int y)
{
    if(x>y)
        return y;
    else
        return x;
}
int a[100010],s[100010][20];
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;++i)
        scanf("%d",&a[i]);
    int x=1;
    int j=1;
    for(int i=1;i<=N;++i)
        s[i][0]=a[i];
    while(x<=N)
    {
        for(int i=1;i<=N;++i)
        {
            if(i+x>N)
                s[i][j]=s[i][j-1];
            else
                s[i][j]=mi(s[i][j-1],s[i+x][j-1]);
        }
        ++j;
        x=x*2;
        b=j;
    }

    for(int i=1;i<=M;++i)
    {
        int rez=100000;
        scanf("%d%d",&c,&d);
        int e=d-c+1;
        while(e>0)
        {
            int t=0;
            int z=1;
            while(z<=e)
            {
                ++t;
                z=2*z;
            }
            t=t-1;
            z=z/2;
            rez=mi(rez,s[c][t]);
            e=e-z;
            c=c+z;
        }
        printf("%d\n",rez);
    }
    return 0;
}