Pagini recente » Cod sursa (job #2220366) | Cod sursa (job #707973) | Cod sursa (job #2048738) | Cod sursa (job #336766) | Cod sursa (job #795340)
Cod sursa(job #795340)
#include<cstdio>
#define NMAX 100002
long int n, m,a[NMAX],minim,mr[NMAX]={-1},x1,y1;
void update(long int nod,long int left,long int right)
{
if( left == right ) mr [ nod ]=left;
else
{
int mid=(left+right)/2;
update( 2 * nod, left ,mid);
update( 2 * nod+1, mid+1,right);
if(a [ mr [ 2 * nod ] ] < a [ mr [2*nod+1] ] ) mr [ nod ] = mr [ 2 * nod ] ;
else mr [ nod ] =mr [ 2 * nod+1 ] ;
}
}
long int query(long int nod,long int left,long int right)
{
if(left>y1 || right < x1)
return -1;
if( x1 <= left && right <= y1 )
return mr[nod];
long int p1,p2;
long int mid=(left+right)/2;
p1=query ( 2*nod ,left , mid );
p2=query( 2*nod+1 , mid+1 , right );
if( p1 == -1 )return p2;
if( p2 == -1 ) return p1;
if( a [ p1 ] <= a [ p2 ] ) return p1;
return p2;
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
update(1,1,n);
for(int i=1;i<=m;++i)
{
scanf("%d %d",&x1,&y1);
minim=query(1,1,n);
printf("%d\n",a[minim]);
}
return 0;
}