Cod sursa(job #1888682)

Utilizator andreicontorandrei contor andreicontor Data 22 februarie 2017 11:54:58
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<cstdio>
using namespace std;
int j,d,n,m,v[101],b[101][110],i,s,t;
int min(int x,int y)
{
    if (x>y) return y;
    else return x;
}
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    for(i=1;i<=n;i++)
        b[1][i]=v[i];
    int p=1,nr=0;
    /*while(p<n)
    {
        p=p*2;
        nr++;
    }
    nr--;
    d=2;
    int mi,c,h;
    for(i=2;i<=20;i++)
    {
        mi=100001;
        c=1;
        h=1;
        while(c<=nr)
        {
            for(j=h;j<=j+d-1;j++)
                if(b[i-1][j]<mi)
                    mi=b[i-1][j];
            b[i][c]=mi;
            h=h+d;
            c++;
        }
    }*/
    p=1;
    for (i=2;i<=20;i++)
    {
        p=p*2;
        for (j=1;j+p<=n+1;j++)
            b[i][j]=min(b[i-1][j],b[i-1][j+p/2]);
        t=i;
        if (p>n) break;
    }
    int x,y,z,l;
    for (i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        z=y-x+1;
        p=1;
        l=0;
        while(p<=z)
        {
            p=p*2;
            l++;
        }
        p=p/2;
        printf("%d\n",min(b[l][x],b[l][y-p+1]));
    }
    /*for(i=1;i<=t;i++)
    {
        for(j=1;j<=n;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }*/
    return 0;
}