Cod sursa(job #1231776)

Utilizator cojocarugabiReality cojocarugabi Data 21 septembrie 2014 15:10:43
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
# include <bits/stdc++.h>
# define nmax 100005
# define lgmax 18
using namespace std;
int S[lgmax][nmax];
int Lg[nmax];
void open()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
}
int read()
{
    char c[8];
    scanf("%s",&c);
    int p(0),i(0);
    while (c[i]) p=p*10+c[i]-'0',++i;
    return p;
}
int main(void)
{
    open();
    int n=read(),m=read();
    Lg[1]=0;
    for (int i = 2;i <= n; ++ i) Lg[i]=Lg[i/2]+1;
    for (int i = 1;i <= n; ++ i) S[0][i]=read();
    int x,y,p;
    for (int i = 1; i <= Lg[n] ;++ i )
        for (int j = 1 , p = n-(1<<i)+1; j<=p;++ j)
            S[i][j]=min(S[i-1][j],S[i-1][j+(1<<(i-1))]);
    while (m--) x=read(),y=read(),p=y-x+1,printf("%d\n",min(S[Lg[p]][x],S[Lg[p]][y+1-(1<<Lg[p])]));
    return 0;
}