ST表(模板)「 查詢區間最值 」
阿新 • • 發佈:2018-12-11
The Water Problem
「 第一部分nlogn預處理 第二部分O(1)詢問 」
#include <iostream> #include <bits/stdc++.h> using namespace std; const int maxn = 1000004; int f[maxn][20]; int a[maxn]; int n,q; void st() { for(int i = 1; i <= n; i ++) f[i][0] = a[i]; int t = log(n) / log(2) + 1; for(int j = 1; j < 20; j ++) { for(int i = 1; i <= n - (1 << j) + 1; i ++) { f[i][j] = max(f[i][j-1],f[i + (1 << (j - 1))][j - 1]); } } } int query(int x, int y) { int t = log(abs(y-x + 1))/ log(2); int a = f[x][t]; int b = f[y - (1 << t) + 1][t]; return max(a,b); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",a+i); int l,r; st(); scanf("%d",&q); while(q--) { scanf("%d%d",&l,&r); cout<<query(l,r)<<endl; } } return 0; }