Pagini recente » Cod sursa (job #2043733) | Cod sursa (job #2537354) | Cod sursa (job #1832726) | Cod sursa (job #2202567) | Cod sursa (job #183504)
Cod sursa(job #183504)
#include <stdio.h>
#define min(a,b) ((a<b)?a:b)
long n,Q,i,j,a[100005],m[18][100005];
long x,y,l,lg[100005];
long rmq(long x,long y){
return min( m[ lg[y-x+1] ] [x],
m[ lg[y-x+1] ] [y-(1<<(lg[y-x+1]))+1] );
}
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld %ld",&n,&Q);
for (i=1;i<=n;i++)
scanf("%ld\n",&a[i]);
//preprocesare
for (i=1;i<=n;++i)
m[0][i]=a[i]; //initializare pt 2^0
for (i=2;i<=n;++i)
lg[i]=lg[i>>1]+1; //vector de logaritmi
l=0;
while ((long)(1<<l+1)<=n)l++; //cea mai mare putere a lui 2 mai mica decat n
for (j=n;j;j--)
for (i=1 ; i<=l && j+(1<<i)<=n+1 ; i++)
m[i][j]=min(m[i-1][j],m[i-1][j+(1<<(i-1))]);
//query
for (i=1;i<=Q;i++){
scanf("%ld %ld\n",&x,&y);
printf("%ld\n",rmq(x,y));
}
return 0;
}