Advertisement
Emiliatan

1282

Nov 8th, 2019
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. /* TIOJ 1282 */
  2. #pragma warning( disable : 4996 )
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cstdint>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <tuple>
  9. #define ios_jazz ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  10.  
  11. using namespace std;
  12.  
  13. constexpr int Dir4[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
  14. constexpr int Dir8[8][2] = { {-1, -1}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 1} };
  15. constexpr double EPS = 1e-9;
  16. const double PI = acos(-1);
  17.  
  18. using int16 = short;
  19. using uint16 = unsigned short;
  20. using uint = unsigned int;
  21. using int64 = long long;
  22. using uint64 = unsigned long long;
  23. using pii = pair<int, int>;
  24.  
  25. /* main code */
  26. constexpr int MAXN = 1e5;
  27.  
  28. int64 gcd(int64 x, int64 y)
  29. {
  30.     return y ? gcd(y, x % y) : x;
  31. }
  32.  
  33. int N, Q, l, r;
  34. int64 nativeArr[MAXN + 1], k;
  35. int op;
  36.  
  37. /* segment tree */
  38. auto lson = [](int x) { return x << 1; };
  39. auto rson = [](int x) { return x << 1 | 1; };
  40. int64 tree[(MAXN + 1) * 4];
  41. void maintain(int);
  42. void sg_build(int = 1, int = 1, int = N);
  43. int64 sg_ask(int, int, int = 1, int = 1, int = N);
  44. void sg_add(int, int64, int = 1, int = 1, int = N);
  45.  
  46. /* BIT */
  47. int64 BIT[MAXN + 1];
  48. auto lowbit = [](int x) { return x & (-x); };
  49. void bit_add(int, int64);
  50. int64 bit_ask(int);
  51.  
  52. int main()
  53. {
  54.     scanf("%d %d", &N, &Q);
  55.  
  56.     for (int i = 1; i <= N; ++i)
  57.         scanf("%lld", nativeArr + i);
  58.  
  59.     sg_build();
  60.  
  61.     while (Q--)
  62.     {
  63.         scanf("%d", &op);
  64.  
  65.         if (op == 1)
  66.         {
  67.             scanf("%d %d %lld", &l, &r, &k);
  68.             sg_add(l, k);
  69.             bit_add(l, k);
  70.             if (r + 1 <= N)
  71.             {
  72.                 sg_add(r + 1, -k);
  73.                 bit_add(r + 1, -k);
  74.             }
  75.         }
  76.         else if (op == 2)
  77.         {
  78.             scanf("%d %d", &l, &r);
  79.             if (l == r)
  80.                 printf("%lld\n", nativeArr[l] + bit_ask(l));
  81.             else
  82.                 printf("%lld\n", abs(gcd(nativeArr[l] + bit_ask(l), sg_ask(l + 1, r))));
  83.         }
  84.     }
  85.  
  86.     return 0;
  87. }
  88.  
  89. /* BIT */
  90. void bit_add(int pos, int64 x)
  91. {
  92.     while (pos <= MAXN)
  93.     {
  94.         BIT[pos] += x;
  95.         pos += lowbit(pos);
  96.     }
  97. }
  98. int64 bit_ask(int pos)
  99. {
  100.     int64 res = 0;
  101.     while (pos)
  102.     {
  103.         res += BIT[pos];
  104.         pos -= lowbit(pos);
  105.     }
  106.     return res;
  107. }
  108.  
  109. /* segment tree */
  110. void maintain(int now)
  111. {
  112.     tree[now] = gcd(tree[lson(now)], tree[rson(now)]);
  113. }
  114. void sg_build(int now, int l, int r)
  115. {
  116.     if (l == r)
  117.     {
  118.         tree[now] = nativeArr[l] - nativeArr[l - 1];
  119.         return;
  120.     }
  121.     int mid = (l + r) >> 1;
  122.     sg_build(lson(now), l, mid);
  123.     sg_build(rson(now), mid + 1, r);
  124.  
  125.     maintain(now);
  126. }
  127. int64 sg_ask(int ql, int qr, int now, int nowl, int nowr)
  128. {
  129.     if (ql <= nowl && nowr <= qr)
  130.         return tree[now];
  131.     if (nowr < ql || nowl > qr)
  132.         return 0;
  133.  
  134.     int mid = (nowl + nowr) >> 1;
  135.     int64 ans = 0;
  136.  
  137.     ans = gcd(ans, sg_ask(ql, qr, lson(now), nowl, mid));
  138.     ans = gcd(ans, sg_ask(ql, qr, rson(now), mid + 1, nowr));
  139.  
  140.     return ans;
  141. }
  142. void sg_add(int pos, int64 val, int now, int nowl, int nowr)
  143. {
  144.     if (nowl == nowr)
  145.     {
  146.         tree[now] += val;
  147.         return;
  148.     }
  149.  
  150.     int mid = (nowl + nowr) >> 1;
  151.  
  152.     if (pos <= mid) sg_add(pos, val, lson(now), nowl, mid);
  153.     else sg_add(pos, val, rson(now), mid + 1, nowr);
  154.  
  155.     maintain(now);
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement