RMQ的树状数组实现:
#include <stdio.h>
#define N 100005
int idx[N];
int num[N];
int n,m,l,r,i,j;
int min(int a,int b)
{
return a<b? a:b;
}
int lowbit(int x)
{
return x&(-x);
}
void init()
{
for(i=1;i<=n;i++)
{
idx[i]=num[i];
for(j=1;j<lowbit(i);j<<=1)
idx[i]=min(idx[i],idx[i-j]);
}
}
int query(int l,int r)
{
int ans=num[r];
while(1)
{
ans=min(ans,num[r]);
if(l==r) break;
for(r--;r-l>=lowbit(r);r-=lowbit(r))
ans=min(ans,idx[r]);
}
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
init();
while(m--)
{
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}
}
return 0;
}