Cod sursa(job #1253676)

Utilizator binicBinica Nicolae binic Data 1 noiembrie 2014 17:24:15
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<cstdio>
using namespace std;
int n,m,x,y,p,p1,q,i,j,a[20][100004];
int main ()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d %d",&n,&m);
    scanf("%d",&y);
    p=1;
    a[0][1]=y;
    while(p*2<n)
    {
        p=p*2;
        q++;
    }
    for(i=2;i<=n;i++)
    {
        scanf("%d",&x);
        if(x==0)printf("linia %d",i+1);
        a[0][i]=x;
        if(x<y)a[1][i-1]=x;
        else a[1][i-1]=y;
        y=x;
    }
    p1=1;
    for(i=2;i<=q;i++)
    {
        p1*=2;
        if(i==11)
            i=11;
        for(j=1;j<=n-p1*2+1;j++)
        {
            if(a[i-1][j]<a[i-1][j+p1])a[i][j]=a[i-1][j];
            else a[i][j]=a[i-1][j+p1];
        }
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d %d",&x,&y);
        p=1;
        q=0;
        n=y-x+1;
        while(p*2<=n)
        {
            p=p*2;
            q++;
        }
        if(a[q][x]<a[q][y-p])printf("%d\n",a[q][x]);
        else printf("%d\n",a[q][y-p]);
    }
    return 0;
}