sacgajcvs

Untitled

Oct 14th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.05 KB | None | 0 0
  1. /*
  2. _____ _ _ _ _
  3. |_ _| |__ ___ / \ _ __ ___| |__ _ _| |
  4. | | | '_ \ / _ \ / _ \ | '_ \/ __| '_ \| | | | |
  5. | | | | | | __// ___ \| | | \__ \ | | | |_| | |
  6. |_| |_| |_|\___/_/ \_\_| |_|___/_| |_|\__,_|_|
  7.  
  8. */
  9. #include<bits/stdc++.h>
  10. #include <ext/pb_ds/assoc_container.hpp>
  11. #include <ext/pb_ds/tree_policy.hpp>
  12. #define ll long long
  13. #define pb push_back
  14. #define ppb pop_back
  15. #define endl '\n'
  16. #define mii map<ll,ll>
  17. #define msi map<string,ll>
  18. #define mis map<ll, string>
  19. #define rep(i,a,b) for(ll i=a;i<b;i++)
  20. #define repr(i,a,b) for(ll i=b-1;i>=a;i--)
  21. #define trav(a, x) for(auto& a : x)
  22. #define pii pair<ll,ll>
  23. #define vi vector<ll>
  24. #define vii vector<pair<ll, ll>>
  25. #define vs vector<string>
  26. #define all(a) (a).begin(),(a).end()
  27. #define F first
  28. #define S second
  29. #define sz(x) (ll)x.size()
  30. #define hell 1000000007
  31. #define lbnd lower_bound
  32. #define ubnd upper_bound
  33. #define max(a,b) (a>b?a:b)
  34. #define min(a,b) (a<b?a:b)
  35.  
  36. /* For Debugging */
  37. #define DEBUG cerr<<"\n>>>I'm Here<<<\n"<<endl;
  38. #define display(x) trav(a,x) cout<<a<<" ";cout<<endl;
  39. #define what_iss(x) cerr << #x << " = " << x << endl;
  40. #define what_is(x) cerr << #x << " = " << x << " ";
  41.  
  42. std::mt19937_64 rng(std::chrono::steady_clock::now().time_since_epoch().count());
  43. #define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update>
  44. #define TIME cerr << "\nTime elapsed: " << setprecision(5) <<1000.0 * clock() / CLOCKS_PER_SEC << "ms\n";
  45. #define DECIMAL(n) cout << fixed ; cout << setprecision(n);
  46. #define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  47. using namespace __gnu_pbds;
  48. using namespace std;
  49. #define PI 3.141592653589793
  50. #define N 100005
  51. ll n;
  52. vi v;
  53.  
  54. struct FenwickTree {
  55. vector<ll> bit; // binary indexed tree
  56. ll n;
  57. map<ll,ll> ma;
  58.  
  59. FenwickTree() {
  60. // this->n = n;
  61. // bit.assign(n, 0);
  62. }
  63.  
  64. void addNumber(ll x) {
  65. ma[x] = 1;
  66. }
  67.  
  68. void process() {
  69. ll cnt = 0;
  70. trav(i,ma) {
  71. i.S = cnt;
  72. cnt++;
  73. }
  74. this->n = sz(ma);
  75. bit.assign(this->n,0);
  76. }
  77.  
  78. // FenwickTree(vector<ll> a) : FenwickTree(a.size()) {
  79. // for (size_t i = 0; i < a.size(); i++)
  80. // add(i, a[i]);
  81. // }
  82.  
  83. ll sum(ll r) {
  84. r = ma[r];
  85. ll ret = 0;
  86. for (; r >= 0; r = (r & (r + 1)) - 1)
  87. ret += bit[r];
  88. return ret;
  89. }
  90.  
  91. ll sum(ll l, ll r) {
  92. return sum(r) - sum(l - 1);
  93. }
  94.  
  95. void add(ll idx, ll delta) {
  96. idx = ma[idx];
  97. for (; idx < n; idx = idx | (idx + 1))
  98. bit[idx] += delta;
  99. }
  100. };
  101.  
  102. vector<FenwickTree> seg(4*N);
  103. // Path Compression at each node
  104. void build(ll cur,ll st,ll end)
  105. {
  106. if(st==end)
  107. {
  108. seg[cur].process();
  109. return;
  110. }
  111. ll mid=(st+end)>>1;
  112. build(2*cur,st,mid);
  113. build(2*cur+1,mid+1,end);
  114. seg[cur].process();
  115. }
  116. // add value for path compression on path of pos
  117. void build(ll cur,ll st,ll end,ll pos,ll upd)
  118. {
  119. if(st==end)
  120. {
  121. seg[cur].addNumber(upd);
  122. return;
  123. }
  124. ll mid = (st+end) >> 1;
  125. if(st<=pos&&pos<=mid)
  126. build(2*cur,st,mid,pos,upd);
  127. else
  128. build(2*cur+1,mid+1,end,pos,upd);
  129. seg[cur].addNumber(upd);
  130. }
  131. // add value for path compression of path from l to r
  132. void build(ll cur,ll st,ll end,ll l,ll r,ll k)
  133. {
  134. if(l<=st&&r>=end)
  135. return seg[cur].addNumber(k);
  136. if(r<st||l>end)
  137. return; /* 2-change here */
  138. ll mid=(st+end)>>1;
  139. build(2*cur,st,mid,l,r,k);
  140. build(2*cur+1,mid+1,end,l,r,k);
  141. seg[cur].addNumber(k);
  142. }
  143.  
  144.  
  145. ll query(ll cur,ll st,ll end,ll l,ll r,ll k)
  146. {
  147. if(l<=st&&r>=end)
  148. return seg[cur].sum(k);
  149. if(r<st||l>end)
  150. return 0; /* 2-change here */
  151. ll mid=(st+end)>>1;
  152. ll ans1=query(2*cur,st,mid,l,r,k);
  153. ll ans2=query(2*cur+1,mid+1,end,l,r,k);
  154. return (ans1+ans2); /* 3-change here */
  155. }
  156. void update(ll cur,ll st,ll end,ll pos,ll upd,ll vl)
  157. {
  158. if(st==end)
  159. {
  160. seg[cur].add(upd,vl);
  161. return;
  162. }
  163. ll mid=(st+end)>>1;
  164. if(st<=pos&&pos<=mid)
  165. update(2*cur,st,mid,pos,upd,vl);
  166. else
  167. update(2*cur+1,mid+1,end,pos,upd,vl);
  168. seg[cur].add(upd,vl);
  169. }
  170.  
  171. void solve()
  172. {
  173. ll q;
  174. cin >> n >> q;
  175. v.resize(n);
  176. rep(i,0,n) {
  177. cin >> v[i];
  178. build(1, 0, n - 1, i, v[i]);
  179. }
  180. vector<pair<pii,pii>> data;
  181. char c;
  182. ll l,r,x;
  183. rep(i,0,q) {
  184. cin >> c;
  185. if(c == 'M') {
  186. cin >> l >> x;
  187. l--;
  188. build(1, 0, n - 1, l, x);
  189. data.pb({{1, l}, {x, -1}});
  190. } else {
  191. cin >> l >> r >> x;
  192. l--,r--;
  193. build(1, 0, n-1, l, r, x);
  194. data.pb({{2, l}, {r, x}});
  195. }
  196. }
  197. build(1,0,n-1);
  198.  
  199. rep(i,0,n) {
  200. update(1, 0, n - 1, i, v[i], 1);
  201. }
  202.  
  203. trav(i,data) {
  204. if(i.F.F == 1) {
  205. l = i.F.S, x = i.S.F;
  206. update(1, 0, n - 1, l, v[l], -1);
  207. v[l] = x;
  208. update(1, 0, n - 1, l, v[l], 1);
  209. } else {
  210. l = i.F.S, r = i.S.F, x = i.S.S;
  211. cout << query(1, 0, n - 1, l, r, x) << endl;
  212. }
  213. }
  214. return;
  215. }
  216. int main()
  217. {
  218. FAST
  219. int TESTS=1;
  220. // cin>>TESTS;
  221. rep(i,0,TESTS)
  222. {
  223. // cout<<"Case #"<<i+1<<": ";
  224. solve();
  225. }
  226. // TIME
  227. return 0;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment