# 資培講義6:進階資料結構
###### tags: `建中資培講義`
> [name=peienwu]
## 主題與重點摘要
## 演算法及程式碼
## 相關例題
- [ ] 題目名稱
### 題目1
[題目連結]()
[Submission]()
> 題目敘述
> 區間RMQ
用Sparse Table 做做看,
```cpp=
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define N 500005
#define MAX_LOG 20
#define Orz ios::sync_with_stdio(0),cin.tie(0)
#define INF 2e18
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
int n,arr[N],D[N][MAX_LOG];
int LOG[N];
void init(){
LOG[1] = 0;
for(int i=2;i<=n;i++){
LOG[i] = LOG[i/2]+1;
}
}
void build_sparse(){
for(int i=0;i<n;i++)D[i][0] = arr[i]; //建立邊界
for(int j=1;(1<<j)<=n;j++){ //logN次
for(int i=0;i+(1<<j)<=n;i++){
D[i][j] = max(D[i][j-1],D[i+(1<<(j-1))][j-1]);
}
}
}
int RMQ(int l, int r){
int p = LOG[r-l+1];
return max(D[l][p],D[r-(1<<p)+1][p]);
}
signed main(){
Orz;
cin>>n;
rep(i,0,n-1)cin>>arr[i];
init();
build_sparse();
int m;cin>>m;
while(m--){
int l,r;cin>>l>>r;l--;r--;
if(l > r)swap(l,r);
cout<<RMQ(l,r)<<endl;
}
}
```
#### 程式碼
### 題目2
[題目連結]()
[Submission]()
> 題目敘述
#### 程式碼
## 心得