Advertisement
Saleh127

Codechef RGCD

Aug 8th, 2021
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define test int t; cin>>t; for(int cs=1;cs<=t;cs++)
  5. ll a[10005];
  6. ll tree[40005];
  7. ll lazy[40005];
  8.  
  9. void push_down(ll node,ll b,ll e)
  10. {
  11. if(b!=e)
  12. {
  13. lazy[node*2]*=lazy[node];
  14. lazy[node*2 + 1]*=lazy[node];
  15. }
  16. tree[node]*=lazy[node];
  17. lazy[node]=1ll;
  18. }
  19.  
  20. void treeconstruct(ll node,ll b,ll e)
  21. {
  22. lazy[node]=1ll;
  23. if(b==e)
  24. {
  25. tree[node]=a[b];
  26. lazy[node]=1ll;
  27. return;
  28. }
  29. ll left = node*2;
  30. ll right = node*2 + 1ll;
  31. ll mid=(b+e)/2;
  32. treeconstruct(left,b,mid);
  33. treeconstruct(right,mid+1,e);
  34. tree[node]=__gcd(tree[left],tree[right]);
  35. }
  36.  
  37. void update(ll node,ll b,ll e,ll i,ll j,ll newv)
  38. {
  39. push_down(node,b,e);
  40. if(i>e || j<b) return;
  41. if(b>=i && e<=j)
  42. {
  43. lazy[node]*=newv;
  44. push_down(node,b,e);
  45. return;
  46. }
  47. ll left = node*2;
  48. ll right = node*2 + 1ll;
  49. ll mid=(b+e)/2;
  50. update(left,b,mid,i,j,newv);
  51. update(right,mid+1,e,i,j,newv);
  52. tree[node]=__gcd(tree[left],tree[right]);
  53. }
  54.  
  55. ll queries(ll node,ll b,ll e,ll i,ll j)
  56. {
  57. push_down(node,b,e);
  58. if(i>e || j<b) return 0ll;
  59. if(b>=i && e<=j) return tree[node];
  60. ll left = node*2;
  61. ll right = node*2 + 1ll;
  62. ll mid=(b+e)/2;
  63. ll x=queries(left,b,mid,i,j);
  64. ll y=queries(right,mid+1,e,i,j);
  65. return __gcd(x,y);
  66. }
  67.  
  68. int main()
  69. {
  70. ios_base::sync_with_stdio(0);
  71. cin.tie(0);
  72. cout.tie(0);
  73.  
  74. test
  75. {
  76. ll q,n,m,i,j,k,l;
  77.  
  78. cin>>n>>m;
  79.  
  80. /*
  81. for(i=0; i<=4*n; i++)
  82. {
  83. tree[i]=0ll;
  84. lazy[i]=1ll;
  85. }
  86. */
  87. for(i=1; i<=n; i++)
  88. {
  89. cin>>a[i];
  90. }
  91.  
  92. treeconstruct(1ll,1ll,n);
  93.  
  94. while(m--)
  95. {
  96. cin>>q;
  97. if(q==1ll)
  98. {
  99. cin>>j>>k;
  100. j++,k++;
  101. cout<<queries(1ll,1ll,n,j,k)<<endl;
  102. }
  103. else
  104. {
  105. cin>>j>>k>>l;
  106. j++,k++;
  107. update(1ll,1ll,n,j,k,l);
  108. }
  109. }
  110. }
  111.  
  112. return 0;
  113. }
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement