描述
给定一个长度不超过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 }