問題:有n只奶牛排成一列,他們有各自的身高Hi,有Q個區間,分別求出這些區間中最高和最矮的差值。
Sample Input
6 3 (六隻奶牛,下面分別是它們的身高,3個區間)
1
7
3
4
2
5
1 5
4 6
2 2
Sample Output
6
3
0 java
- import java.io.StreamTokenizer;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.io.OutputStreamWriter;
- import java.io.IOException;
-
- class tree{
- int left,right,maxvalue,minvalue;
- }
-
- public class Main{
- tree[] tt;
-
- int height[];
-
- public Main(int[] height){
- this.height=height;
- tt=new tree[131070];
- for(int i=0;i<131070;i++)
- tt[i]=new tree();
- }
-
- private void built_tree(int lp,int rp,int pos){
- tt[pos].left=lp;
- tt[pos].right=rp;
- if(lp==rp){
- tt[pos].maxvalue=height[rp];
- tt[pos].minvalue=height[lp];
- return ;
- }
- int mid=(tt[pos].left+tt[pos].right)>>1;
- built_tree(lp,mid,pos<<1);
- built_tree(mid+1,rp,pos<<1|1);
- tt[pos].maxvalue=Math.max(tt[pos<<1].maxvalue,tt[pos<<1|1].maxvalue);
- tt[pos].minvalue=Math.min(tt[pos<<1].minvalue,tt[pos<<1|1].minvalue);
- }
-
- private int findmax(int lp,int rp,int pos){
- if(tt[pos].left==lp&&tt[pos].right==rp){
- return tt[pos].maxvalue;
- }
-
- int mid=(tt[pos].left+tt[pos].right)>>1;
- if(rp<=mid){
- return findmax(lp,rp,pos<<1);
- }
- else if(lp>mid)
- return findmax(lp,rp,pos<<1|1);
- else{
- return Math.max( findmax(lp,mid,pos<<1), findmax(mid+1,rp,pos<<1|1));
- }
- }
-
- private int findmin(int lp,int rp,int pos){
- if(tt[pos].left==lp&&tt[pos].right==rp){
- return tt[pos].minvalue;
- }
- int mid=(tt[pos].left+tt[pos].right)>>1;
- if(rp<=mid)
- return findmin(lp,rp,pos<<1);
- else if(lp>mid)
- return findmin(lp,rp,pos<<1|1);
- else
- return Math.min( findmin( lp,mid,pos<<1 ),findmin( mid+1,rp,pos<<1|1 ) );
- }
-
- public static void main(String args[]) throws IOException{
- StreamTokenizer st = new StreamTokenizer(new BufferedReader(
- new InputStreamReader(System.in)));
- PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
-
- while(st.nextToken() != StreamTokenizer.TT_EOF) {
-
- int n=(int) st.nval;
- st.nextToken();
- int q=(int) st.nval;
- int[] height=new int[n+1];
- for(int i=1;i<=n;++i){
- st.nextToken();
- height[i]=(int) st.nval;
- }
-
- Main ma=new Main(height);
- ma.built_tree(1,n,1);
- int x,y;
- while(q-->0){
- st.nextToken();
- x=(int) st.nval;
- st.nextToken();
- y=(int) st.nval;
- int mmax=ma.findmax(x,y,1);
- int mmin=ma.findmin(x,y,1);
- System.out.printf("%d\n",mmax-mmin);
- }
- out.flush();
-
- }
- }
- }