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]);
}
}
}