TrickmanOff

E task

May 2nd, 2020
804
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. #pragma optimization_level 3
  2. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
  3. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <fstream>
  7. #include <vector>
  8. #include <queue>
  9. #include <functional>
  10. #include <set>
  11. #include <map>
  12. #include <math.h>
  13. #include <cmath>
  14. #include <string>
  15. #include <random>
  16. #include <unordered_set>
  17. #include <unordered_map>
  18. #include <bitset>
  19. #include <string.h>
  20. #include <stack>
  21. #include <assert.h>
  22. #include <list>
  23. #include <time.h>
  24. #include <memory>
  25. #include <chrono>
  26. using namespace std;
  27. //
  28. #define fast cin.tie(0);cout.tie(0);cin.sync_with_stdio(0);cout.sync_with_stdio(0);
  29. //#define cin in
  30. //#define cout out
  31. #define ll long long
  32. #define db double
  33. #define ld long double
  34. #define uset unordered_set
  35. #define umap unordered_map
  36. #define F first
  37. #define S second
  38. #define ms multiset
  39. #define pb push_back
  40. #define pq priority_queue
  41. #define umap unordered_map
  42. #define uset unordered_set
  43. #define ull unsigned long long
  44. #define pii pair<int, int>
  45. #define pll pair<ll, ll>
  46. #define pdd pair<ld, ld>
  47. #define pnn pair<Node*, Node*>
  48. #define uid uniform_int_distribution
  49. #define PI acos(-1.0)
  50. //#define sort(a, b) sort(a.begin(), a.end(), b())
  51. //mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  52. ifstream in("input.txt");
  53. ofstream out("output.txt");
  54.  
  55. //#pragma comment(linker, "/STACK:256000000")
  56.  
  57. const int MAX_N = 3e5;
  58. int n, m, type;
  59. vector<int> nums;
  60.  
  61. int fen[2*MAX_N], ans[MAX_N];
  62.  
  63. void incr(int p, int val) {
  64.     for (; p < 2*MAX_N; p |= (p + 1))
  65.         fen[p]+= val;
  66. }
  67.  
  68. int get_sum(int p) {
  69.     int sum = 0;
  70.     for (; p >= 0; p = (p & (p + 1)) - 1)
  71.         sum += fen[p];
  72.     return sum;
  73. }
  74.  
  75. int get_sum(int l, int r) {
  76.     if (l > r) return 0;
  77.     return get_sum(r) - (l == 0 ? 0 : get_sum(l - 1));
  78. }
  79.  
  80. void q1() {
  81.     vector<pii> poss(n);
  82.     for (int i = 0; i < n; i++) poss[i] = { nums[i], i };
  83.     sort(poss.begin(), poss.end(), greater<pii>());
  84.  
  85.     for (int i = 0; i < n;) {
  86.         int a = poss[i].first;
  87.  
  88.         int j = i;
  89.         while (j < n && poss[j].first == a) j++;
  90.         j--;
  91.  
  92.         ans[poss[j].second] = get_sum(poss[j].second) + a;
  93.  
  94.         while (i <= j)
  95.             incr(poss[i++].second, 1);
  96.     }
  97. }
  98.  
  99. void q2() {
  100.     memset(fen, 0, sizeof(fen));
  101.     vector<int> L(MAX_N, -1);
  102.     //memset(L, 255, sizeof(L));
  103.  
  104.     for (int i = 0; i < n; i++) {
  105.         int a = nums[i];
  106.         int lp = L[a];
  107.         if (lp != -1) {
  108.             ans[i] = get_sum(lp + 1, i - 1) + 1;
  109.             incr(lp, -1);
  110.         }
  111.         L[a] = i;
  112.         incr(i, 1);
  113.     }
  114. }
  115.  
  116. void solve1() {
  117.     q1();
  118.     q2();
  119. }
  120.  
  121. int s_array[2 * MAX_N];
  122.  
  123. int get_kth(int k) {
  124.     int l = -1, r = 2 * MAX_N-1;
  125.     while (r - l > 1) {
  126.         int m = (l + r) / 2;
  127.         if (get_sum(m) >= k) r = m;
  128.         else l = m;
  129.     }
  130.     return r;
  131. }
  132.  
  133. void solve2() {
  134.     for (int i = 0; i < m; i++) {
  135.         s_array[n + i] = i+1;
  136.         incr(n + i, 1);
  137.     }
  138.  
  139.     int p = n - 1;
  140.  
  141.     for (int i = 0; i < n; i++) {
  142.         int pos = get_kth(nums[i]);
  143.         incr(pos, -1);
  144.         incr(p, 1);
  145.         s_array[p] = ans[i] = s_array[pos];
  146.         p--;
  147.     }
  148. }
  149.  
  150. void input() {
  151.     cin >> n >> m >> type;
  152.     nums.resize(n);
  153.     for (int& x : nums) cin >> x;
  154. }
  155.  
  156. int main() {
  157.     fast;
  158.     input();
  159.  
  160.     if (type == 1) solve1();
  161.     else solve2();
  162.     for (int i = 0; i < n; i++) cout << ans[i] << ' ';
  163. }
Advertisement
Add Comment
Please, Sign In to add comment