Cod sursa(job #676794)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 9 februarie 2012 16:38:55
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <cstdio>
const int nmax=100005;
using namespace std;
int m[nmax][18],a[nmax],log[nmax],n,mi;
int min(int x,int y)
{ if(x<y)return x; else return y; return 0; }
void rmq()
{ int i,j;
m[1][0]=a[1]; log[1]=0;
for(i=2;i<=n;++i)
    {
    m[i][0]=a[i];
    log[i]=log[i>>1]+1;
    }
for(j=1;(1<<j)<=n;++j)
    {
    for(i=1;i<=n-(1<<j)+1;++i)
       m[i][j]=min(m[i][j-1],m[i+(1<<(j-1))][j-1]);
    }
}
int main()
{ int x,y,k,i;
freopen("rmq.out","w",stdout);
freopen("rmq.in","r",stdin); scanf("%d %d\n",&n,&mi);
for(i=1;i<=n;++i)
    scanf("%d\n",&a[i]);
rmq();
for(i=1;i<=mi;++i)
    {
    scanf("%d %d\n",&x,&y);
    k=log[y-x+1];
    printf("%d\n",min(m[x][k],m[y-(1<<k)+1][k]));
    }
fclose(stdin);
fclose(stdout);
return 0;
}