Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <unordered_map>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. const int max_n = 600001;
  9.  
  10. int f[max_n];
  11. int d[max_n];
  12. int a[max_n];
  13.  
  14. int get(int r) {
  15. int res = 0;
  16. while (r >= 0) {
  17. res += f[r];
  18. r = (r & (r + 1)) - 1;
  19. }
  20. return res;
  21. }
  22.  
  23. void upd(int x, int d) {
  24. while (x < max_n) {
  25. f[x] += d;
  26. x |= (x + 1);
  27. }
  28. }
  29.  
  30.  
  31. int main() {
  32. int n, m, type;
  33. cin >> m >> n >> type;
  34. for (int i = 1; i <= n; i++) {
  35. upd(max_n / 2 + i, 1);
  36. d[i] = max_n / 2 + i;
  37. a[max_n / 2 + i] = i;
  38. }
  39. if (type == 1) {
  40. int cur = max_n / 2;
  41. vector<int> v;
  42. for (int i = 0; i < m; i++) {
  43. int x;
  44. cin >> x;
  45. v.push_back(get(d[x]));
  46. a[cur] = x;
  47. upd(d[x], -1);
  48. upd(d[x]=cur--, 1);
  49. }
  50. for (int i = 0; i < m; i++) {
  51. cout << v[i] << ' ';
  52. }
  53. } else {
  54. int cur = max_n / 2;
  55. vector<int> v;
  56. for (int i = 0; i < m; i++) {
  57. int x;
  58. cin >> x;
  59. int l = 0, r = max_n;
  60. while (r - l > 1) {
  61. int mid = (r + l) / 2;
  62. if (get(mid) >= x) {
  63. r = mid;
  64. } else {
  65. l = mid;
  66. }
  67. }
  68. x = a[r];
  69. v.push_back(a[r]);
  70. a[cur] = x;
  71. upd(d[x], -1);
  72. upd(d[x]=cur--, 1);
  73. }
  74. for (int i = 0; i < m; i++) {
  75. cout << v[i] << ' ';
  76. }
  77. }
  78. return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement