Cod sursa(job #917610)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 10:14:46
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include<cstdio>
#define min(a,b) (a)<=(b)?(a):(b)
using namespace std;
int v[100001];
int log[100001];
int mat[100001][25];
int main(){
int i,n,m,j,x,y,p;
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",v+i);
for(i=0;i<=n;++i)
mat[i][0]=i;
for(j=1;1<<j<=n;++j)
for(i=0;i+(1<<j)-1<=n;++i)
if(v[mat[i][j-1]]<v[mat[i+(1<<(j-1))][j-1]])
mat[i][j]=mat[i][j-1];
else
mat[i][j]=mat[i+(1<<(j-1))][j-1];
log[0]=0;
p=1;
for(i=1;i<=n;++i)
if(p*2<=i) log[i]=log[i-1]+1,p*=2;
else log[i]=log[i-1];
for(i=0;i<m;++i){
scanf("%d%d",&x,&y);
p=log[y-x+1];
printf("%d\n",min(v[mat[x][p]],v[mat[y-(1<<p)+1][p]]));
}
//hoteluri.. infoarena!
return 0;
}