st表

const ll maxn = 1e6 + 9;
ll st[maxn][25];
ll sst[maxn][25];
ll ssg[maxn][25];
ll LOG2[maxn];
ll query_max(ll l, ll r) {
    ll k = LOG2[r - l + 1];
    return max(st[l][k], st[r - (1 << k) + 1][k]);
}
ll query_min(ll l, ll r) {
    ll k = LOG2[r - l + 1];
    return min(sst[l][k], sst[r - (1 << k) + 1][k]);
}

ll query_gcd(ll l, ll r) {
    ll k = LOG2[r - l + 1];
    return __gcd(ssg[l][k], ssg[r - (1 << k) + 1][k]);
}
void init(vector<ll> v) {
    ll len = v.size() - 1;
    for (ll i = 1; i <= len; i++) {
        LOG2[i] = log2(i);
    }

    for (ll i = 1; i <= len; i++) {
        st[i][0] = sst[i][0] = ssg[i][0] = v[i];
    }
    for (ll j = 1; j <= 24; j++) {
        for (ll i = 1; i + (1 << j) - 1 <= len; i++) {
            sst[i][j] = min(sst[i][j - 1], sst[i + (1 << (j - 1))][j - 1]);
            st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
            ssg[i][j] = __gcd(ssg[i][j - 1], ssg[i + (1 << (j - 1))][j - 1]);
        }
    }
}
posted @ 2021-07-31 19:55  u_yan  阅读(29)  评论(0编辑  收藏  举报