- Description
给定一个长度不超过10000的整数序列,对这个序列有不超过500000个询问,每次询问给定区间之内的最小值.
- Input
第一行一个整数N(N<=10000)
第二行N个整数
第三行一个整数Q
以下共Q行,每行两个整数i,j用空格隔开,询问第i号元素到第j号元素之间的最小值
- Output
每个询问输出一行,包含一个整数,为询问区间内的最小值
- Sample Input
5
1 2 3 4 5
2
1 5
3 4
- Sample Output
1
3
#include<iostream>
using namespace std;
#define min(x,y) ((x)<=(y)?(x):(y))
#define N 20010
struct node
{
int l,r,v;
};
int total,s[N];
node arr[2*N];
int Build(int l,int r,int k)
{
arr[k].l=l,arr[k].r=r;
if(l==r)
{
return arr[k].v=s[l];
}
int mid=(l+r)/2;
return (arr[k].v=min(Build(l,mid,2*k),Build(mid+1,r,2*k+1)));
}
int Query(int l,int r,int k)
{
if(arr[k].l==l && arr[k].r==r)
{
return arr[k].v;
}
int mid=(arr[k].l+arr[k].r)/2;
if(r<=mid)
{
return Query(l,r,2*k);
}
else
{
if(l>mid)
return Query(l,r,2*k+1);
else
return min(Query(l,mid,2*k),Query(mid+1,r,2*k+1));
}
}
int main()
{
// freopen("in.txt","r",stdin);
int times,n,m;
scanf("%d",&total);
{
for(int i=1;i<=total;i++)
scanf("%d",&s[i]);
Build(1,total,1);
scanf("%d",×);
for(int j=0;j<times;j++)
{
scanf("%d %d",&n,&m);
if(n>m)
{
int temp=n;
n=m;
m=temp;
}
printf("%d\n",Query(n,m,1));
}
}
return 0;
}