Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #define boost cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false);
- #define ll long long
- using namespace std;
- ll gcd (ll a, ll b) {
- return b ? gcd (b, a % b) : a;
- }
- struct segtree {
- ll n;
- vector < ll > data;
- ll get(ll l, ll r) {
- return get(0, 0, n - 1, l, r);
- }
- ll set(ll p, ll x) {
- set(0, 0, n - 1, p, x);
- }
- ll get(ll id, ll sl, ll sr, ll ql, ll qr) {
- if (sl >= ql && sr <= qr) {
- return data[id];
- }
- ll m = (sl + sr) / 2;
- if (qr <= m) {
- return get(id * 2 + 1, sl, m, ql, qr);
- } else if (ql > m) {
- return get(id * 2 + 2, m + 1, sr, ql, qr);
- } else {
- return gcd(get(id * 2 + 1, sl, m, ql, qr), get(id * 2 + 2, m + 1, sr, ql, qr));
- }
- }
- void set(ll id, ll sl, ll sr, ll p, ll x) {
- if (sl == sr) {
- data[id] += x;
- return;
- }
- ll m = (sl + sr) / 2;
- if (m >= p) {
- set(id * 2 + 1, m, sr, p, x);
- } else {
- set(id * 2 + 2, sl, m + 1, p, x);
- }
- data[id] = data[id * 2 + 1] + data[id * 2 + 2];
- }
- segtree(ll n_) {
- n = n_;
- data.resize(n * 4);
- }
- void build(const vector < ll > & a) {
- build(0, 0, n - 1, a);
- }
- void build(ll id, ll sl, ll sr,
- const vector < ll > & a) {
- if (sl == sr) {
- data[id] = a[sl];
- return;
- }
- ll m = (sl + sr) / 2;
- build(id * 2 + 1, sl, m, a);
- build(id * 2 + 2, m + 1, sr, a);
- data[id] = gcd(data[id * 2 + 1], data[id * 2 + 2]);
- }
- };
- int main() {
- boost;
- ll n; cin >> n;
- vector<ll> data(n);
- segtree st(n);
- for (ll i = 0; i < n; i++) {
- cin >> data[i];
- }
- st.build(data);
- ll q; cin >> q;
- ll l, r;
- for (ll i = 0; i < q; i++) {
- cin >> l >> r;
- cout << st.get(l-1, r-1) << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement