Cod sursa(job #1252805)

Utilizator tester_31tester tester_31 Data 31 octombrie 2014 12:14:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<cstdio>
#include<algorithm>

using namespace std;

#define nmax 100006
#define logmax 20

int rmq[logmax][nmax],n,m,i,k,u,j;
int a[nmax];
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",&rmq[0][i]);
    a[1]=0;
    for (i=2; i<=n; ++i) a[i]=a[i/2]+1;
    for (i=1; (1<<i)<=n; ++i)
        for (j=1; j<=n-(1<<i)+1; ++j)
        {
        int pr=1<<(i-1);
        rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+pr]);
        }
    int x,y;
    while (m--)
    {
        scanf("%d%d",&x,&y);
        int dif=y-x+1;
        int pr=a[dif];
        int unde=dif-(1<<pr);
        printf("%d\n",min(rmq[pr][x],rmq[pr][x+unde]));
    }
return 0;

}