我太菜了
今天才学会现场脑补ST表静态RMQ
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstdlib> 6 #include<cstring> 7 #include<queue> 8 #include<map> 9 #include<vector> 10 #define ll long long 11 #define inf 2147483611 12 #define MAXN 101010 13 #define MOD 1000000 14 using namespace std; 15 inline int read() 16 { 17 int x=0,f=1;char ch=getchar(); 18 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 19 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 20 return x*f; 21 } 22 int n,Q,f[MAXN][22]; 23 int main() 24 { 25 n=read(),Q=read(); 26 for(int i=1;i<=n;i++) f[i][0]=read(); 27 for(int i=1;i<=20;i++) 28 for(int j=1;j<=n;j++) 29 { 30 if((1<<i)+j>n+1) break; 31 f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]); 32 } 33 /*for(int i=1;i<=n;i++) 34 for(int j=0;j<=16;j++) printf("%d %d %d\n",i,j,f[i][j]);*/ 35 int a,b,t,k; 36 while(Q--) 37 { 38 a=read(),b=read();t=b-a+1; 39 for(int i=20;i>=0;i--) 40 if(t&(1<<i)) {k=i;break;} 41 printf("%d\n",max(f[a][k],f[a+t-(1<<k)][k])); 42 } 43 }