1042-区间最值

描述

给定一个长度不超过10000的整数序列,对这个序列有不超过500000个询问,每次询问给定区间的最小值。

输入

第一行一个整数N(N<=10000)
第二行N个整数
第三行一个整数Q
以下共Q行,每行两个整数i,j用空格隔开,询问第i号元素到第第j号元素之间的最小值

输出

每个询问输出一行,包含一个整数,为询问区间的最小值

样例输入

5
1 2 3 4 5
2
1 5
3 4

样例输入

1
3

  1 #include"stdafx.h"
  2 #include<iostream>
  3 using namespace std;
  4 
  5 #define N 10001
  6 #define MAX 50001
  7 
  8 int min(int a,int b)
  9 {
 10     return a<b?(a):(b);
 11 }
 12 
 13 struct Node
 14 {
 15     int left;
 16     int right;
 17     int key;
 18     Node* leftchild;
 19     Node* rightchild;
 20 };
 21 
 22 struct Node* BuildTree(int a,int b)
 23 {
 24     struct Node *root=new struct Node;
 25     root->left=a;
 26     root->right=b;
 27     if(a==b)
 28     {   
 29         root->key=0x7FFFFFFF;
 30         root->leftchild=NULL;
 31         root->rightchild=NULL;
 32     }
 33     else
 34     {
 35         int middle=(a+b)>>1;
 36         root->leftchild=BuildTree(a,middle);
 37         root->rightchild=BuildTree(middle+1,b);
 38     }
 39     return root;
 40 }
 41 
 42 void Insert(struct Node* root,int a,int b,int data)
 43 {
 44     int middle=(root->left+root->right)>>1;
 45     if(a<=root->left&&b>=root->right)
 46     {
 47         root->key=data;
 48         return;
 49     }
 50     if(a<=middle&&root->leftchild)
 51     {
 52         Insert(root->leftchild,a,b,data);
 53     }
 54     if(b>middle&&root->rightchild)
 55     {
 56         Insert(root->rightchild,a,b,data);
 57     }
 58     root->key=min(root->leftchild->key,root->rightchild->key);
 59 }
 60 
 61 int Search(struct Node* root,int a,int b)
 62 {
 63     int middle=(root->left+root->right)>>1;
 64     int temp;
 65     int key1=0x7FFFFFFF;
 66     int key2=0x7FFFFFFF;
 67     if(a<=root->left&&b>=root->right)
 68     {
 69         return root->key;
 70     }
 71     if(a<=middle)
 72     {
 73         temp=Search(root->leftchild,a,b);
 74         if(key1>temp)
 75             key1=temp;
 76     }
 77     if(b>middle)
 78     {
 79         temp=Search(root->rightchild,a,b);
 80         if(key2>temp)
 81             key2=temp;
 82     }
 83     return min(key1,key2);
 84 }
 85 
 86 int main()
 87 {
 88     int temp=0x7FFFFFFF;
 89     int n,q,i,j;
 90     cin>>n;
 91     struct Node* tree;
 92     tree=BuildTree(0,n-1);
 93     for(i=0;i<n;i++)
 94     {
 95         int temp;
 96         cin>>temp;
 97         Insert(tree,i,i,temp);
 98     }
 99     cin>>q;
100     while(q--)
101     {
102         cin>>i>>j;
103         cout<<Search(tree,i-1,j-1)<<endl;
104     }
105     return 0;
106 }

 

posted @ 2013-09-26 17:50  七年之后  阅读(260)  评论(0编辑  收藏  举报