Cod sursa(job #2027351)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 25 septembrie 2017 22:19:21
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <iostream>
#include <cstdio>
using namespace std;

int r[18][100001],log[100001];
int main()
{freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int i,j,m,n,p,a,b,dif,sh;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
    scanf("%d",&r[0][i]);


for(i=2;i<=n;i++)log[i]=log[i/2]+1;
for(i=1;(1<<i)<=n;i++)
{p=1<<(i-1);
    for(j=0;j<n-1<<i+1;j++)
    {
        if(r[i-1][j]<r[i-1][j+p])r[i][j]=r[i-1][j];
        else r[i][j]=r[i-1][j+p];
    }
}
p=i;

for(i=0;i<p;i++)
{
    for(j=0;j<n;j++)printf("%d ",r[i][j]);
    printf("\n");

}


for(i=0;i<m;i++)
{
    scanf("%d%d",&a,&b);
    dif=b-a+1;
    p=log[dif];
    sh=dif-(1<<(p));

    if(r[p][a]<r[p][a+sh])printf("%d\n",r[p][a]);
        else printf("%d\n",r[p][a+sh]);
}


    return 0;
}