Cod sursa(job #1253654)

Utilizator binicBinica Nicolae binic Data 1 noiembrie 2014 16:48:55
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
using namespace std;
int n,m,x,y,p,p1,q,i,j,a[20][100002];
int main ()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d %d",&n,&m);
    scanf("%d",&y);
    p=1;
    while(p*2<n)
    {
        p=p*2;
        q++;
    }
    for(i=2;i<=n;i++)
    {
        scanf("%d",&x);
        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;
        j=0;
        while(a[0][j+p1]!=0)
        {
            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+1])printf("%d\n",a[q][x]);
        else printf("%d\n",a[q][y-p+1]);
    }
    return 0;
}