Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <numeric>
- #include <vector>
- #include <map>
- #define F first
- #define S second
- using namespace std;
- using vi = vector<int>;
- using pi = pair<int, int>;
- using vpi = vector<pi>;
- const int N = 1e5;
- int gcd(int a, int b) {
- while(b != 0) swap(a %= b, b);
- return a;
- }
- int main() {
- ios_base::sync_with_stdio(0); cin.tie(0);
- int n, m=2; cin >> n;
- while((m*m)*(m*m) <= n) ++m; --m;
- vi v[5]; v[0] = vi(n);
- for(int i = 0; i < n; ++i) cin >> v[0][i];
- for(int i = 1; i < 5; ++i) {
- v[i] = vi(1+v[i-1].size() / m);
- for(int j = 0, k = -1; j < v[i-1].size(); ++j) {
- if(j-m == k*m) v[i][++k] = v[i-1][j];
- else v[i][k] = gcd(v[i][k], v[i-1][j]);
- }
- }
- int q; cin >> q;
- while (q--) {
- int l, r; cin >> l >> r; --l;
- int a = 0, t = 1, j = 0;
- for(; j < 4; t *= m, ++j)
- for(int dm = t*m; l+t <= r && l % dm; l += t) a = gcd(a, v[j][l/t]);
- for(++j; j--; t /= m)
- for(; l+t <= r; l += t) a = gcd(a, v[j][l/t]);
- cout << a << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement