1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 /* 6 说明: 7 RMQ<T> rr;定义一个查询区间最小值的数据类型为T 的类 8 SetMaxn(T maxn);设置初始化数组的最大值 9 Creat(T a[],int maxn) 设置查询的数组,和数组长度,从0开始 10 Getx(int la,int lb) 查询数组中下标为 la - lb 的区间的最小值 11 Getw(int la,int lb) 查询数组中位置为 la - lb 的区间最小值 12 自定义类型需要重载 < 13 */ 14 template<class T> 15 class RMQ{ 16 public: 17 T* a; 18 int t; 19 T **mn; 20 T maxn; 21 int *log2; 22 void SetMaxn(T *maxn){ 23 this->maxn=*maxn; 24 } 25 void SetMaxn(T maxn){ 26 this->maxn=maxn; 27 } 28 void Creat(T a[],int maxn){//建立一个最大为maxn的RMQ处理类 29 int k=1,p=0; 30 log2=new int[maxn+1]; 31 for(int i=0;i<=maxn;i++) 32 log2[i]=(i==0?-1:log2[i>>1]+1); 33 while(k<maxn){ 34 k*=2; 35 p+=1; 36 } 37 mn=new T*[maxn+1]; 38 for(int i=0;i<maxn;i++){ 39 mn[i] = new T[t+1]; 40 mn[i][0]=a[i]; 41 for(int j=1;j<=t;j++) 42 mn[i][j]=maxn; 43 } 44 t=p; 45 for(int j=1;j<=t;j++) 46 for(int i=0;i+(1<<j) <= maxn;i++){ 47 T sa=mn[i][j-1]; 48 T sb=mn[i+(1<<(j-1))][j-1]; 49 if(sa<sb) 50 mn[i][j]=sa; 51 else 52 mn[i][j]=sb; 53 } 54 } 55 T Getx(int ql,int qr){ 56 int k=log2[qr-ql+1]; 57 return min(mn[ql][k],mn[qr-(1<<k)+1][k]); 58 } 59 T Getw(int ql,int qr){ 60 ql--,qr--; 61 int k=log2[qr-ql+1]; 62 return min(mn[ql][k],mn[qr-(1<<k)+1][k]); 63 } 64 } ; 65 RMQ<int> rr; 66 int a[]={1,3,4,5,6,7,2,4,5,6,7,8}; 67 int main(){ 68 rr.SetMaxn(0x7f7f7f7f); 69 rr.Creat(a,12); 70 while(1){ 71 int a,b; 72 scanf("%d%d",&a,&b); 73 cout<<rr.Getw(a,b)<<endl; 74 } 75 }