題目背景
這是一道ST表經典題——靜態區間最大值html
請注意最大數據時限只有0.8s,數據強度不低,請務必保證你的每次查詢複雜度爲 O(1)O(1)ios
題目描述
給定一個長度爲 NN 的數列,和 MM 次詢問,求出每一次詢問的區間內數字的最大值。ide
輸入輸出格式
輸入格式:
第一行包含兩個整數 N, MN,M ,分別表示數列的長度和詢問的個數。大數據
第二行包含 NN 個整數(記爲 a_iai),依次表示數列的第 ii 項。spa
接下來 MM行,每行包含兩個整數 l_i, r_ili,ri,表示查詢的區間爲 [ l_i, r_i][li,ri]code
輸出格式:
輸出包含 MM行,每行一個整數,依次表示每一次詢問的結果。htm
輸入輸出樣例
說明
對於30%的數據,知足: 1 \leq N, M \leq 101≤N,M≤10blog
對於70%的數據,知足: 1 \leq N, M \leq {10}^51≤N,M≤105get
對於100%的數據,知足: 1 \leq N \leq {10}^5, 1 \leq M \leq {10}^6, a_i \in [0, {10}^9], 1 \leq l_i \leq r_i \leq N1≤N≤105,1≤M≤106,ai∈[0,109],1≤li≤ri≤Nstring
![](http://static.javashuo.com/static/loading.gif)
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int st[1000010][21]; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int query(int l,int r){ int k=log2(r-l+1); return max(st[l][k],st[r-(1<<k)+1][k]); } int main(){ n=read();m=read(); for(int i=1;i<=n;i++) st[i][0]=read(); for(int j=1;j<=21;j++) for(int i=1;i+(1<<j)-1<=n;i++) st[i][j]=max(st[i][j-1],st[i+(1<<j)-1][j-1]); for(int i=1;i<=m;i++){ int l=read(); int r=read(); printf("%d\n",query(l,r)); } }