[luogu P3865] 【模板】ST表
阿新 • • 發佈:2018-12-08
題目
https://www.luogu.org/problemnew/show/P3865#sub
解題思路
表可以有很多用途,例如RMQ問題。
其他更多模板請見(https://blog.csdn.net/qq_39897867/article/details/83623201)
程式碼
#include<cstdio>
#include<cmath>
#include<cstring>
#define rr register
using namespace std;
int n,m,x,y,f[100003][18];
inline int maxx(int x,int y){return x>y?x:y;}
inline int read()
{
int p=0,f=1; char c; c=getchar();
while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }
while (c>='0'&& c<='9') p=(p<<3)+(p<<1)+c-48,c=getchar();
return p*f;
}
void ST_prework()
{
int t=log(n)/log(2)+1;
for (rr int j=1;j<t;j++)
for (rr int i=1;i<=n-(1<<j)+1;i++)
f[i][j]=maxx(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
inline int ST_query(int l,int r)
{
int k=log(r-l+ 1)/log(2);
return maxx(f[l][k],f[r-(1<<k)+1][k]);
}
int main()
{
n=read(); m=read();
for (rr int i=1;i<=n;i++) f[i][0]=read();
ST_prework();
for (rr int i=1;i<=m;i++)
x=read(),y=read(),printf("%d\n",ST_query(x,y));
return 0;
}