Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. #include <istream>
  2. #include <fstream>
  3.  
  4. #include <iostream>
  5.  
  6.  
  7. #include <math.h>
  8. #include <map>
  9. #include <vector>
  10. #include <set>
  11. #include <deque>
  12. #include <algorithm>
  13. using namespace std;
  14.  
  15.  
  16.  
  17.  
  18.  
  19. #define ull unsigned long long
  20. #define ll long long
  21. #define pii pair<int,int>
  22.  
  23.  
  24. struct Treap {
  25. int key;
  26. int prior;
  27. int pos;
  28. int size;
  29. int val;
  30. Treap * l;
  31. Treap * r;
  32. Treap(int val) {
  33. this->val = -1;
  34. l = nullptr;
  35. r = nullptr;
  36. this->prior = rand();
  37. size = 1;
  38. this->pos = val;
  39. }
  40.  
  41. };
  42.  
  43. void update_size(Treap * &t) {
  44. if(t==nullptr)
  45. return;
  46. t->size = (t->l!=nullptr ? t->l->size : 0) + (t->r!=nullptr ? t->r->size : 0) + 1;
  47. int adasd = t->size;
  48. }
  49.  
  50. Treap * merge(Treap * tl, Treap * tr) {
  51. //ALL VALS INT TR IS NOT LESS THAN IN TL
  52. if (tl == nullptr)
  53. return tr;
  54. if (tr == nullptr)
  55. return tl;
  56.  
  57. if (tl->prior > tr->prior) {
  58. tl->r = merge(tl->r, tr);
  59. update_size(tl);
  60. return tl;
  61. } else {
  62. tr->l = merge(tl, tr->l);
  63. update_size(tr);
  64. return tr;
  65. }
  66. }
  67.  
  68.  
  69.  
  70. void split(Treap * t, int key, Treap *& tl, Treap *& tr) {
  71. if (t == nullptr) {
  72. tl = nullptr;
  73. tr = nullptr;
  74. return;
  75. }
  76.  
  77. int l = t->l!= nullptr ? t->l->size : 0;
  78.  
  79. if (key > l) {
  80. split(t->r, key - l - 1, tl, tr);
  81. t->r = tl;
  82. update_size(t);
  83. tl = t;
  84. } else {
  85. split(t->l, key, tl, tr);
  86. t->l = tr;
  87. update_size(t);
  88. tr = t;
  89. }
  90.  
  91. }
  92.  
  93.  
  94.  
  95. int tests() {
  96. Treap * tree = new Treap(0);
  97. int pr = tree->prior;
  98. for (int i = 1; i < 5; i++) {
  99. Treap * to_merge = new Treap(i);
  100. int asd = to_merge->prior;
  101. tree = merge(tree, to_merge);
  102. }
  103. int ddd = tree->size;
  104. Treap * tl;
  105. Treap * tr;
  106. split(tree,2,tl,tr);
  107. Treap * tl2;
  108. Treap * tr2;
  109. split(tr,1,tl2,tr2);
  110. int ksdf = tl->val;
  111.  
  112.  
  113. exit(0);
  114. }
  115.  
  116.  
  117. vector<pii> ans;
  118.  
  119.  
  120. void dfs(Treap * t){
  121. if(t==nullptr)
  122. return;
  123. ans.push_back({t->pos,t->val});
  124. dfs(t->l);
  125. dfs(t->r);
  126. }
  127.  
  128. void error(){
  129. printf("-1");
  130. exit(0);
  131. }
  132.  
  133. vector<unsigned char> used;
  134.  
  135. int main() {
  136. #ifdef LOCAL
  137. freopen("input.txt","r",stdin);
  138. freopen("output.txt","w",stdout);
  139. #endif // LOCAL
  140. cin.sync_with_stdio(false);
  141. //tests();
  142. Treap * tree = new Treap(1);
  143. int n, m;
  144. scanf("%d%d",&n,&m);
  145. // cin >> n >> m;
  146. // n = 1000000;
  147. used.resize(n+10);
  148. for (int i = 2; i <= n; i++) {
  149. Treap * v = new Treap(i);
  150. tree = merge(tree, v);
  151. }
  152.  
  153.  
  154.  
  155. for (int i = 1; i <= m; i++) {
  156. int val, pos;
  157. scanf("%d%d",&val,&pos);
  158. // cin >> val >> pos;
  159. // val = i;
  160. // pos = i;
  161. if(val > n || pos > n)
  162. error();
  163. Treap * tl1;
  164. Treap * tr1;
  165.  
  166. split(tree, pos-1, tl1, tr1);
  167.  
  168. Treap * tl2;
  169. Treap * tr2;
  170. split(tr1, 1, tl2, tr2);
  171.  
  172.  
  173.  
  174. // int ls = tl1->size;
  175. // int rs = tr1->size;
  176.  
  177. if(tl2->val != -1 && tl2->val != val)
  178. error();
  179. if(tl2->val == -1 && used[val]==1)
  180. error();
  181.  
  182. tl2->val = val;
  183. used[val] = 1;
  184.  
  185. tree = merge(tl2, tl1);
  186. tree = merge(tree,tr2);
  187. }
  188. dfs(tree);
  189. sort(ans.begin(),ans.end());
  190. deque<int> not_used;
  191. for(int i = 1; i <= n; i++){
  192. if((int)used[i]==0)
  193. not_used.push_back(i);
  194. }
  195. for(auto& i :ans){
  196. if(i.second==-1){
  197. printf("%d ",(int)not_used[0]);
  198. // cout << (int)not_used[0] << ' ';
  199. not_used.pop_front();
  200. }else
  201. printf("%d ",i.second);
  202. }
  203. return 0;
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement