Advertisement
Guest User

Untitled

a guest
Jul 15th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.31 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:268435456")
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <map>
  6. #include <iomanip>
  7. #include <stack>
  8. #include <string>
  9. #include <set>
  10. #include <queue>
  11. #include <functional>
  12. #include <deque>
  13. #include <cmath>
  14. #include <sstream>
  15. #include <bitset>
  16. #define what_is(x) cerr << #x << " = " << x << endl;
  17.  
  18. using namespace std;
  19.  
  20. #define forn(i,n) for(int i = 0; i < n; i++)
  21. #define forr(i,n) for(int i = n-1; i >= 0; i++)
  22. #define ALL(x) x.begin(),x.end()
  23. #define mp make_pair
  24. #define sf(x,y) scanf("%" x,&y)
  25. #define pf(x,y) printf("%" x,y)
  26. #define sqr(x) (x)*(x)
  27.  
  28. typedef long long int64;
  29. typedef long double ld;
  30. #define int int64
  31.  
  32. typedef unsigned long long uint64;
  33. typedef pair<int, int> pii;
  34. typedef pair<int64, int64> pii64;
  35. typedef pair<double, double> pdd;
  36. typedef vector<int> vint;
  37. typedef vector<int64> vint64;
  38. typedef vector<double> vd;
  39. typedef vector<vint> vvint;
  40.  
  41. template <typename T1, typename T2> istream& operator >> (istream& in, pair<T1, T2>& t) { return in >> t.first >> t.second; }
  42. template <typename T1, typename T2> ostream& operator << (ostream& out, pair<T1, T2>& t) { return out << t.first << " " << t.second << endl; }
  43. template <typename T> istream& operator >> (istream& in, vector<T>& t) { for (int i = 0; i < t.size(); i++) in >> t[i]; return in; }
  44. template <typename T> ostream& operator << (ostream& out, vector<T>& t) { for (int i = 0; i < t.size(); i++) out << t[i] << " "; return out; }
  45.  
  46. struct ST {
  47. struct Item {
  48. Item *l = 0, *r = 0;
  49. int mn = 2e9;
  50. int cnt = 0;
  51. Item(int val, int cnt) : mn(val), cnt(cnt) {}
  52. Item() {}
  53. };
  54.  
  55. Item* root = 0;
  56.  
  57. vector<Item*> g;
  58.  
  59. int get_mn(Item* it) {
  60. return it ? it->mn : 2e9;
  61. }
  62. int get_cnt(Item* it) {
  63. return it ? it->cnt : 0;
  64. }
  65.  
  66. void upd(Item* it) {
  67. it->mn = min(get_mn(it->l), get_mn(it->r));
  68. it->cnt = get_cnt(it->l) + get_cnt(it->r);
  69. }
  70.  
  71. Item* build(vint& ve, int l, int r) {
  72. if (l > r) return 0;
  73. if (l == r) {
  74. return new Item(ve[l], 1);
  75. }
  76. int m = (l + r) / 2;
  77. Item* it = new Item();
  78. it->l = build(ve, l, m);
  79. it->r = build(ve, m + 1, r);
  80. upd(it);
  81. return it;
  82. }
  83.  
  84. void insert(int i, int val, Item* v) {
  85. if (v == 0) {
  86. v = new Item(val, 1); return;
  87. }
  88. if (v->l == 0 && v->r == 0) {
  89. v->r = new Item(v->mn, 1);
  90. v->l = new Item(val, 1);
  91. upd(v); return;
  92. }
  93. if (v->cnt - 1 >= i) {
  94. insert(i, val, v->l);
  95. }else insert(i - get_cnt(v->l), val, v->r);
  96. }
  97.  
  98. void rebuild() {
  99. vint t; t.reserve(2e5); dfs(t, root);
  100. build(t, 0, t.size() - 1);
  101. }
  102.  
  103. void dfs(vint& t, Item* v) {
  104. if (v == 0) return;
  105. if (v->l == 0 && v->r == 0) {
  106. t.push_back(v->mn);
  107. delete v;
  108. return;
  109. }
  110. dfs(t, v->l);
  111. dfs(t, v->r);
  112. }
  113.  
  114. int mn(Item* v, int l, int r){
  115. if (r < 0) return 2e9;
  116. if (l <= 0 && get_cnt(v) - 1 <= r){
  117. return get_mn(v);
  118. }
  119. mn(v->l, l, r);
  120. mn(v->r, l - get_cnt(v->l), r - get_cnt(v->l));
  121. }
  122. };
  123.  
  124. signed main()
  125. {
  126. freopen("abc.txt", "r", stdin);
  127. int n; cin >> n;
  128. ST tree;
  129. for(int i = 0;i < n; ++i) {
  130. char op; cin >> op;
  131. if(op == '+'){
  132. int i, x; cin >> i >> x;
  133. tree.insert(i, x, tree.root);
  134. } else {
  135. int i, j; cin >> i >> j; i--; j--;
  136. cout << tree.mn(tree.root, i, j) << endl;
  137. }
  138. if(i % 1000 == 0) tree.rebuild();
  139. }
  140. return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement