ST 表

实现
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100010
int st[MAXN][20], m, n;
inline int query(int l, int r)
{
    int len = log2(r - l + 1);
    return max(st[l][len], st[r - (1 << len) + 1][len]);
}
inline int read()
{
    char ch = getchar();
    int f = 1, x = 0;
    while (!isdigit(ch))
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (isdigit(ch))
        x = (x << 3) + (x << 1) + (ch - '0'), ch = getchar();
    return f * x;
}
inline void write(int x)
{
    if (x < 0)
    {
        putchar('-');
        write(-x);
        return;
    }
    if (x >= 10)
    {
        write(x / 10);
    }
    putchar(x % 10 + '0');
    return;
}
int main()
{
    n = read(), m = read();
    for (int i = 1; i <= n; i++)
        st[i][0] = read();
    int deep = log2(n);
    for (int d = 1; d <= deep; d++)
        for (int s = 1; s + (1 << d) - 1 <= n; s++)
            st[s][d] = max(st[s][d - 1], st[s + (1 << (d - 1))][d - 1]);
    while (m--)
    {
        int l = read(), r = read();
        write(query(l, r));
        puts("");
    }
    return 0;
}