The ST table, as far as I know (Konjac), is a great tool for solving the RMQ problem (interval maximum and minimum).
This thing uses the idea of multiplication.
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int MAXN=1e6+10; inline int read() { char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int f[MAXN][21]; int Query(int l,int r) { int k=log2(r-l+1); return max(f[l][k],f[r-(1<<k)+1][k]); } intmain () { int N=read(),M=read(); for(int i=1;i<=N;++i)f[i][0]=read(); for(int j=1;j<=21;++j) for(int i=1;i+(1<<j)-1<=N;i++) f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); for(int i=1,l,r;i<=M;++i) { l=read();r=read(); printf("%d\n",Query(l,r)); } }