洛谷P3865 【模板】ST表
给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#include<set>
using namespace std;
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[100010][21];//f[i][j]的表示为以i开始长度为2^j的区间最值
int n;
void st()
{
for (int j = 1; j <= 20; j++)//2^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]);//求两块区域的最值
}
}
}
int query(int l, int r)
{
int c = log2(r - l + 1);//r-l+1为区间长度
return max(f[l][c], f[r - (1 << c) + 1][c]);//求最值所以区间重叠也没关系
}
int main()
{
int m;
n = read(), m = read();
for (int i = 1; i <= n; i++)
{
f[i][0]=read();
}
st();
for (int i = 1; i <= m; i++)
{
int l = read(), r = read();
printf("%d\n", query(l, r));
}
return 0;
}
样例输入
8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8
样例输出
9 9 7 7 9 8 7 9