悬关求调
查看原帖
悬关求调
644963
ln001楼主2024/1/18 16:30

0pts

#include <bits/stdc++.h>
#define ll long long
#define fst                      \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
#define f(x, y, z) for (register ll x = (y); x <= (z); x++)
using namespace std;

namespace ST
{
const ll N = 1e6 + 10, M = ceil(log2(N));
const ll po2[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432};
struct STB
{
    ll st[N][21];
    ll n;
    bool qmax = 0;
    ll max_o_min(ll a, ll b)
    {
        if (qmax)
            return max(a, b);
        else
            return min(a, b);
    }
    void make(ll make_n, ll a[], bool kkk)
    {
        qmax = kkk;
        n = make_n;
        f(i, 1, n) st[i][0] = a[i];
        f(i, 1, n)
        {
            f(j, 1, M)
            {
                if (i - 1 + po2[j] > n)
                    break;
                st[i][j] = max_o_min(st[i][j - 1], st[i + po2[j] - 1 - po2[j - 1] + 1][j - 1]);
            }
        }
    }
    ll check(ll l, ll r)
    {

        ll len = r - l + 1;
        len = log2(len); //po2[len]

        return max_o_min(st[l][len], st[r - po2[len] + 1][len]);
    }
};
} // namespace ST

const long long INF = 0x3f3f3f3f3f3f3f3f, N = 1e5 + 10;
ll n, m;
ll a[N];
ST::STB st_max;
signed main()
{
    fst;
    cin >> n >> m;
    f(i, 1, n) cin >> a[i];
    st_max.make(n, a, 1);

    f(i, 1, m)
    {
        ll l, r;
        cin >> l >> r;
        cout << st_max.check(l, r) << endl;
    }
    return 0;
}

2024/1/18 16:30
加载中...