Cod sursa(job #975757)

Utilizator andrettiAndretti Naiden andretti Data 21 iulie 2013 15:55:15
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#include<algorithm>
#define maxn 100005
#define lgn 20
using namespace std;

int n,m;
int v[maxn],lg[maxn];
int s[lgn][maxn];

void read()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&v[i]);
}

void preproc()
{
    int i,j;
    for(i=1;i<=n;i++) s[0][i]=v[i];
    lg[1]=0;
    for(i=2;i<=n;i++) lg[i]=lg[i/2]+1;

    for(i=1;i<=lg[n];i++)
     for(j=1;j<=n;j++)
      s[i][j]=min(s[i-1][j],s[i-1][j+(1<<(i-1))]);
}

void solve()
{
    int x,y,l,pw;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        l=lg[y-x+1];
        pw=1<<l;
        printf("%d\n",min(s[l][x],s[l][y-pw+1]));
    }
}

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

    read();
    preproc();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}