Advertisement
Maruf_Hasan

circular RMQ AC

Feb 20th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define M 200100
  4. #define Mx 1e9
  5. #define ll long long
  6. ll arr[M];
  7. //int tree[4*M];
  8. ll tree2[4*M];
  9. ll lazy[4*M];
  10.  
  11. void init(ll node,ll b,ll e)
  12. {
  13. if(b==e)
  14. {
  15. // tree[node]=arr[b];
  16. tree2[node]=arr[b];
  17. return;
  18. }
  19. ll left=node*2;
  20. ll right=left+1;
  21. ll mid=(b+e)/2;
  22. init(left,b,mid);
  23. init(right,mid+1,e);
  24. //tree[node]=tree[left]+tree[right];
  25. tree2[node]=min(tree2[left],tree2[right]);
  26. }
  27.  
  28. void update(ll node,ll b,ll e,ll i,ll j,ll val)
  29. {
  30. if(lazy[node])
  31. {
  32. //tree[node]+=(e-b+1)*lazy[node];
  33. tree2[node]+=lazy[node];
  34. if(b!=e)
  35. {
  36. lazy[node*2]+=lazy[node];
  37. lazy[node*2+1]+=lazy[node];
  38. }
  39. lazy[node]=0;
  40. }
  41. if(e<i || b>j)
  42. return;
  43. if(b>=i && e<=j)
  44. {
  45. //tree[node]+=(e-b+1)*lazy[node];
  46. tree2[node]+=val;
  47. if(b!=e)
  48. {
  49. lazy[node*2]+=val;
  50. lazy[node*2+1]+=val;
  51. }
  52. return;
  53. }
  54. ll mid=(b+e)/2;
  55. ll left=node<<1;
  56. ll right=left+1;
  57. update(left,b,mid,i,j,val);
  58. update(right,mid+1,e,i,j,val);
  59. //tree[node]=tree[left]+tree[right];
  60. tree2[node]=min(tree2[left],tree2[right]);
  61. }
  62. ll query(ll node,ll b,ll e,ll i,ll j)
  63. {
  64. if(b>j || e<i)
  65. return Mx;
  66. if(lazy[node])
  67. {
  68. tree2[node]+=lazy[node];
  69. if(b!=e)
  70. {
  71. lazy[node*2]+=lazy[node];
  72. lazy[node*2+1]+=lazy[node];
  73. }
  74. lazy[node]=0;
  75. }
  76. if(b>=i && e<=j)
  77. {
  78. return tree2[node];
  79. }
  80. ll mid=(b+e)/2;
  81. ll left=node<<1;
  82. ll right=left+1;
  83. ll p1=query(left,b,mid,i,j);
  84. ll p2=query(right,mid+1,e,i,j);
  85. return min(p1,p2);
  86. }
  87.  
  88. int main()
  89. {
  90. ll n,i;
  91. cin>>n;
  92. for(i=1;i<=n;i++)
  93. {
  94. scanf("%lld",&arr[i]);
  95. }
  96. //for(i=1;i<=n;i++)
  97. //1 cout<<arr[i]<<" ";
  98. init(1,1,n);
  99. ll qq;
  100. scanf("%lld ",&qq);
  101. char a[100];
  102. //getchar();
  103. while(qq--)
  104. {
  105.  
  106. scanf(" %[^\n]",a);
  107. vector<ll>v;
  108. stringstream ss(a);
  109. ll num;
  110. while(ss >> num)
  111. {
  112. v.push_back(num);
  113. }
  114.  
  115. //for(i=0;i<v.size();i++)
  116. // cout<<v[i]<<endl;
  117.  
  118.  
  119. if(v.size()==2)
  120. {
  121. ll ans;
  122. ll p=v[0]+1,q=v[1]+1;
  123. if(p<=q)
  124. {
  125.  
  126. ans=query(1,1,n,p,q);
  127. }
  128. else
  129. {
  130. ll a1=query(1,1,n,p,n);
  131. ll a2=query(1,1,n,1,q);
  132. ans=min(a1,a2);
  133. }
  134. cout<<ans<<endl;
  135. }
  136. else
  137. {
  138. ll p=v[0]+1;
  139. ll q=v[1]+1;
  140. if(p<=q)
  141. {
  142. update(1,1,n,p,q,v[2]);
  143. }
  144. else
  145. {
  146. //int p=v[0]+1;
  147. //int q=v[1]+1;
  148. update(1,1,n,p,n,v[2]);
  149. update(1,1,n,1,q,v[2]);
  150. }
  151. }
  152. }
  153. return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement