Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #define boost cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false);
  4. #define ll long long
  5. using namespace std;
  6.  
  7. ll gcd (ll a, ll b) {
  8. return b ? gcd (b, a % b) : a;
  9. }
  10.  
  11. struct segtree {
  12. ll n;
  13. vector < ll > data;
  14. ll get(ll l, ll r) {
  15. return get(0, 0, n - 1, l, r);
  16. }
  17. ll set(ll p, ll x) {
  18. set(0, 0, n - 1, p, x);
  19. }
  20. ll get(ll id, ll sl, ll sr, ll ql, ll qr) {
  21. if (sl >= ql && sr <= qr) {
  22. return data[id];
  23. }
  24. ll m = (sl + sr) / 2;
  25. if (qr <= m) {
  26. return get(id * 2 + 1, sl, m, ql, qr);
  27. } else if (ql > m) {
  28. return get(id * 2 + 2, m + 1, sr, ql, qr);
  29. } else {
  30. return gcd(get(id * 2 + 1, sl, m, ql, qr), get(id * 2 + 2, m + 1, sr, ql, qr));
  31. }
  32. }
  33. void set(ll id, ll sl, ll sr, ll p, ll x) {
  34. if (sl == sr) {
  35. data[id] += x;
  36. return;
  37. }
  38. ll m = (sl + sr) / 2;
  39. if (m >= p) {
  40. set(id * 2 + 1, m, sr, p, x);
  41. } else {
  42. set(id * 2 + 2, sl, m + 1, p, x);
  43. }
  44. data[id] = data[id * 2 + 1] + data[id * 2 + 2];
  45. }
  46. segtree(ll n_) {
  47. n = n_;
  48. data.resize(n * 4);
  49. }
  50. void build(const vector < ll > & a) {
  51. build(0, 0, n - 1, a);
  52. }
  53. void build(ll id, ll sl, ll sr,
  54. const vector < ll > & a) {
  55. if (sl == sr) {
  56. data[id] = a[sl];
  57. return;
  58. }
  59. ll m = (sl + sr) / 2;
  60. build(id * 2 + 1, sl, m, a);
  61. build(id * 2 + 2, m + 1, sr, a);
  62. data[id] = gcd(data[id * 2 + 1], data[id * 2 + 2]);
  63. }
  64. };
  65.  
  66.  
  67. int main() {
  68. boost;
  69. ll n; cin >> n;
  70. vector<ll> data(n);
  71. segtree st(n);
  72. for (ll i = 0; i < n; i++) {
  73. cin >> data[i];
  74. }
  75. st.build(data);
  76. ll q; cin >> q;
  77. ll l, r;
  78. for (ll i = 0; i < q; i++) {
  79. cin >> l >> r;
  80. cout << st.get(l-1, r-1) << "\n";
  81. }
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement