Advertisement
Guest User

Untitled

a guest
Sep 25th, 2022
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. using namespace std;
  6. using namespace __gnu_pbds;
  7.  
  8. using int64 = int64_t;
  9. #define int int64
  10. #define double long double
  11.  
  12. #define vi vector<int>
  13. #define mii map<int, int>
  14. #define pii pair<int, int>
  15. #define vii vector<pii>
  16.  
  17. #define ff first
  18. #define ss second
  19. #define pb push_back
  20. #define ppb pop_back()
  21. #define in insert
  22. #define lb lower_bound
  23. #define ub upper_bound
  24. #define fr front()
  25. #define bk back()
  26. #define endl '\n'
  27. #define MP make_pair
  28. #define MSB(x) __lg(x)
  29. #define LSB(x) (int)log2((x) & -(x))
  30. #define SORT(x) is_sorted(all(x))
  31. #define size(x) (int)(x).size()
  32. #define all(x) (x).begin(), (x).end()
  33. #define rall(x) (x).rbegin(), (x).rend()
  34. #define MAX(x) *max_element(all(x))
  35. #define MIN(x) *min_element(all(x))
  36. #define SUM(x) accumulate(all(x), 0LL)
  37. #define PRE(x, y) partial_sum(all(x), y.begin())
  38. #define MEM(x, y) memset(x, y, sizeof(x))
  39. #define CNT(x) __builtin_popcountll(x)
  40. #define rep(i, a, b) for (int i = (a); i < (b); i++)
  41. #define bck(i, a, b) for (int i = (a) - 1; i >= (b); i--)
  42. #define LEFT(a, l, r, k) rotate(a.begin() + l, a.begin() + l + (k % (r - l + 1)), a.begin() + r + 1)
  43. #define RIGHT(a, l, r, k) rotate(a.begin() + l, a.begin() + r + 1 - (k % (r - l + 1)), a.begin() + r + 1)
  44.  
  45. /* --------------------------------------------------------- TEMPLATES --------------------------------------------------- */
  46.  
  47. class custom_hash{public: static uint64_t splitmix64(uint64_t x){ x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31);}
  48. size_t operator()(uint64_t x) const {static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM);}
  49. };
  50. template<typename T1, typename T2> // cin >> pair<T1, T2>
  51. istream& operator>>(istream &in, pair<T1, T2> &p){ return (in >> p.first >> p.second);}
  52. template<typename T> // cin >> vector<T>
  53. istream& operator>>(istream &in, vector<T> &v){for(auto &it: v) cin >> it; return in;}
  54. template<typename T1, typename T2> // cout << pair<T1, T2>
  55. ostream& operator<<(ostream &out, const pair<T1, T2> &p){return (out << p.first << " " << p.second); }
  56. template<typename T> //cout << vector<T>
  57. ostream& operator<<(ostream &out, const vector<T> &c){for (auto &it: c) cout << it << " "; return out;}
  58.  
  59. template<class T1, class T2 = vector<T1>, class T3 = less<T1>>
  60. ostream& operator<<(ostream& out, priority_queue<T1, T2, T3> const& pq){
  61. static priority_queue<T1, T2, T3> a = pq;
  62. out << "{"; string sep;
  63. while(!a.empty()){out << sep << a.top(); sep = ", "; a.pop();}
  64. return (out << "}");
  65. }
  66. template<class T>
  67. ostream& operator<<(ostream& out, queue<T> const& q){
  68. static queue<T> a = q;
  69. out << "{"; string sep;
  70. while(!a.empty()){out << sep << a.front(); sep = ", "; a.pop();}
  71. return (out << "}");
  72. }
  73. template<class T>
  74. ostream& operator<<(ostream& out, stack<T> const& s){
  75. static stack<T> a = s;
  76. out << "{"; string sep;
  77. while(!a.empty()){out << sep << a.top(); sep = ", "; a.pop();}
  78. return (out << "}");
  79. }
  80.  
  81. template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  82. template <typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>;
  83. template <typename T> using vec = vector<vector<T>>;
  84. template <typename T1, int T2> using var = vector<array<T1, T2>>;
  85. template <typename T1, typename T2> using umap = unordered_map<T1, T2, custom_hash>;
  86. template <typename T1, typename T2> using gphash = gp_hash_table<T1, T2, custom_hash>;
  87. template <typename T1, typename T2> void amax(T1 &x, T2 y) {if(x < y) x = y;}
  88. template <typename T1, typename T2> void amin(T1 &x, T2 y) {if(x > y) x = y;}
  89.  
  90. /* ----------------------------------------------------------- DEBUGGING AREA ------------------------------------------------------ */
  91.  
  92. void __print(int x) {cerr << x;}
  93. void __print(double x) {cerr << x;}
  94. void __print(char x) {cerr << '\'' << x << '\'';}
  95. void __print(bool x) {cerr << (x ? "true" : "false");}
  96. void _print() {cerr << "]\n";}
  97.  
  98. template <typename T1, typename T2> void __print(const pair<T1, T2> &x) {cerr << '{'; __print(x.ff); cerr << ','; __print(x.ss); cerr << '}';}
  99. template <typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
  100. template <typename T1, typename... T2> void _print(T1 t, T2... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
  101.  
  102. #ifndef Future_Legendary_Grand_Master
  103. #define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
  104. #else
  105. #define debug(x...)
  106. #endif
  107.  
  108. /* --------------------------------------------------------- UNIVERSAL CONSTANTS --------------------------------------------------- */
  109.  
  110. const double pi = acos((double)-1.0);
  111. const double eps = 1e-9;
  112. const int mod = 1e9 + 7;
  113. const int mod2 = 998244353LL;
  114. const int64 inf = 2e18;
  115. const int64 INF = 9e18;
  116. const int dx[16] = {1, 0, 0, -1, 1, 1, -1, -1, 2, 2, 1, 1, -1, -1, -2, -2};
  117. const int dy[16] = {0, -1, 1, 0, -1, 1, -1, 1, -1, 1, -2, 2, -2, 2, -1, 1};
  118.  
  119. /* --------------------------------------------------------- USEFUL FUNCTIONS ---------------------------------------------------- */
  120. int testcase;
  121. int iseq(double x, double y) {return abs(x - y) < eps;}
  122. bool isSquare(int x) {int y = sqrtl(x); return x == y * y;}
  123. bool ispow2(int x) {return (x ? !(x & (x - 1)) : 0);}
  124. int ceill(int x, int y) {return (x >= 0 ? (x + y - 1) / y : x / y);}
  125. int floorr(int x, int y) {return x / y - ((x ^ y) < 0 and x % y);}
  126. int gcd(int x, int y) {return (x ? gcd(y % x, x) : y);}
  127. int lcm(int x, int y) {return x / gcd(x, y) * y;}
  128. void google() {cout << "Case #" << ++testcase << ": ";}
  129. int expo(int x, int y, int64 m = INF) {int res = 1; x = x % m; while (y > 0){if (y & 1) res = (res * x) % m; y = y >> 1LL, x = (x * x) % m;} return res;}
  130. int inv(int n, int m) {return expo(n, m - 2, m);}
  131. int gen(int x, int y) {srand(time(0)); return x + rand() % (y - x + 1);}
  132.  
  133. /* --------------------------------------------------------- FAST INPUT/OUTPUT ----------------------------------------------------- */
  134.  
  135. void IOS()
  136. {
  137. ios_base::sync_with_stdio(false);
  138. cin.tie(nullptr);
  139. cout.tie(nullptr);
  140. cout.precision(20);
  141. cout.setf(ios::fixed);
  142. // #undef endl // uncomment for interactives
  143. // #undef int // uncomment for MLEs or TLEs
  144. // find_by_order(K): Returns an iterator to the Kth largest element (counting from zero)
  145. // order_of_key (K): Returns the number of items that are strictly smaller than K
  146. }
  147.  
  148. /* ------------------------------------------------------- SOLUTION TO THE PROBLEM ------------------------------------------------- */
  149.  
  150. template <class T>
  151. class SegmentTree{
  152. private:
  153. int n;
  154. vector<T> segtree;
  155. public:
  156. SegmentTree(int n){
  157. this->n = n;
  158. segtree.resize(4 * n + 1);
  159. }
  160. T op(T x, T y){
  161. return (x + y);
  162. }
  163. void update(int x, int l, int r, int idx, T val){
  164. if (l > idx or r < idx)
  165. return;
  166. if (l == r)
  167. {
  168. segtree[x] = val;
  169. return;
  170. }
  171. int mid = (l + r) / 2LL;
  172. update(2 * x, l, mid, idx, val);
  173. update(2 * x + 1, mid + 1, r, idx, val);
  174. segtree[x] = op(segtree[2 * x], segtree[2 * x + 1]);
  175. }
  176. void update(int idx, T val){
  177. update(1, 1, n, idx, val);
  178. }
  179. T query(int x, int l, int r, int L, int R){
  180. if (L <= l and R >= r)
  181. return segtree[x];
  182. if (L > r or R < l)
  183. return 0;
  184. int mid = (l + r) / 2LL;
  185. return op(query(2 * x, l, mid, L, R), query(2 * x + 1, mid + 1, r, L, R));
  186. }
  187. T query(int l, int r){
  188. return l > r ? 0 : query(1, 1, n, l, r);
  189. }
  190. };
  191.  
  192. void solve()
  193. {
  194. int n, m;
  195. cin >> n >> m;
  196. SegmentTree<int> f(n);
  197. vector<SegmentTree<int>> fcnt;
  198. rep(i, 0, 3){
  199. SegmentTree<int> a(n);
  200. fcnt.pb(a);
  201. }
  202. rep(i, 1, n + 1){
  203. int x;
  204. cin >> x;
  205. f.update(i, x);
  206. fcnt[--x].update(i, 1);
  207. }
  208. int ans = 0;
  209. rep(i, 0, m){
  210. int x, y, z;
  211. cin >> x >> y >> z;
  212. int val = f.query(x, x) - 1;
  213. fcnt[val].update(x, 0);
  214. f.update(x, y);
  215. val = f.query(x, x) - 1;
  216. fcnt[val].update(x, 1);
  217. int diff = f.query(1, z) - f.query(z + 1, n);
  218. vi l, r;
  219. rep(j, 0, 3){
  220. l.pb(fcnt[j].query(1, z));
  221. r.pb(fcnt[j].query(z + 1, n));
  222. }
  223. if (diff < 0)
  224. diff = -diff, swap(l, r);
  225. if (diff & 1){
  226. --ans;
  227. continue;
  228. }
  229. // let sum of l > sum of r
  230. int cnt1 = min(l[2], r[0]);
  231. int cur1 = min(diff / 4, cnt1);
  232. diff -= 4 * cur1;
  233. l[2] -= cur1, r[2] += cur1;
  234. r[0] -= cur1, l[0] += cur1;
  235. int cnt2 = min(r[0], l[1]);
  236. int cur2 = min(diff / 2, cnt2);
  237. diff -= 2 * cur2;
  238. r[0] -= cur2, l[0] += cur2;
  239. l[1] -= cur2, r[1] += cur2;
  240. int cnt3 = min(r[1], l[2]);
  241. int cur3 = min(diff / 2, cnt3);
  242. diff -= 2 * cur3;
  243. r[1] -= cur3, l[1] += cur3;
  244. l[2] -= cur3, r[2] += cur3;
  245. if (diff == 0)
  246. ans += cur1 + cur2 + cur3;
  247. else
  248. --ans;
  249. }
  250. google();
  251. cout << ans << endl;
  252. }
  253.  
  254. int32_t main()
  255. {
  256. IOS();
  257. int ttc = 1;
  258. cin >> ttc;
  259. while (ttc--)
  260. solve();
  261. return 0;
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement