Advertisement
Galebickosikasa

Untitled

Dec 2nd, 2021
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3. // #pragma comment(linker, "/stack:200000000"]
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <bitset>
  16. #include <stack>
  17. #include <random>
  18. #include <fstream>
  19. #include <sstream>
  20. #include <chrono>
  21.  
  22. #define fi first
  23. #define se second
  24. #define pb push_back
  25. #define ll long long
  26. #define ld long double
  27. #define hm unordered_map
  28. #define pii pair<int, int>
  29. #define sz(a) (int)a.size()
  30. #define all(a) a.begin(), a.end()
  31. #define cinv(v) for (auto& x: v) cin >> x
  32. #define fr(i, n) for (int i = 0; i < n; ++i)
  33. #define fl(i, l, n) for (int i = l; i < n; ++i)
  34.  
  35. #define int ll
  36.  
  37. using namespace std;
  38.  
  39. #ifdef __LOCAL
  40. #define dbg(x) cerr << #x << " : " << x << '\n'
  41. const int maxn = 20;
  42. #else
  43. #define dbg(x)
  44. const int maxn = 2e5 + 20;
  45. #endif
  46.  
  47. //tg: @galebickosikasa
  48.  
  49. const ll inf = (ll) 2e9;
  50. const ld pi = asin (1) * 2;
  51. const ld eps = 1e-8;
  52. const ll mod = (ll)1e9 + 7;
  53. const ll ns = 97;
  54.  
  55. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  56.  
  57. struct Line {
  58. int a, b;
  59.  
  60. Line (int a = -inf, int b = 0) : a(a), b(b) {}
  61.  
  62. int get (int x) {
  63. return a + x * b;
  64. }
  65.  
  66. };
  67.  
  68. struct Node {
  69. Node* l;
  70. Node* r;
  71. Line line;
  72.  
  73. Node (Node* l, Node* r, Line t) : l(l), r(r), line(t) {}
  74.  
  75. Node () {
  76. l = r = nullptr;
  77. line = Line ();
  78. }
  79.  
  80. int get (int x) {
  81. return line.get (x);
  82. }
  83.  
  84. };
  85.  
  86. Node* upd (Node* t, int left, int right, Line l) {
  87. int mid = (right + left) / 2;
  88. if (t == nullptr) t = new Node ();
  89. int m = t->get (mid) < l.get (mid);
  90. int L = t->get (left) < l.get (left);
  91. Node* N = new Node (t->l, t->r, t->line);
  92. if (m) swap (N->line, l);
  93. if (left == right) return N;
  94. if (m != L) N->l = upd (N->l, left, (left + right) / 2, l);
  95. else N->r = upd (N->r, (right + left) / 2 + 1, right, l);
  96. return N;
  97. }
  98.  
  99. int get (Node* t, int left, int right, int x) {
  100. if (t == nullptr) return -inf;
  101. // dbg (t);
  102. // dbg (t->line.a);
  103. // dbg (t->line.b);
  104. if (left == right) return t->get (x);
  105. int mid = (right + left) / 2;
  106. if (x <= mid) return max (t->get (x), get (t->l, left, (left + right) / 2, x));
  107. else return max (t->get (x), get (t->r, (left + right) / 2 + 1, right, x));
  108. }
  109.  
  110. signed main () {
  111. ios_base::sync_with_stdio(false);
  112. cin.tie(nullptr);
  113. cout.tie(nullptr);
  114. int n, q;
  115. cin >> n >> q;
  116. vector <Node*> goo (n, nullptr);
  117. while (q--) {
  118. char t;
  119. cin >> t;
  120. if (t == '#') {
  121. int a, b;
  122. cin >> a >> b;
  123. --a, --b;
  124. goo[b] = goo[a];
  125. } else if (t == '+') {
  126. int T, a, b;
  127. cin >> T >> a >> b;
  128. --T;
  129. goo[T] = upd (goo[T], 1, 2e5, Line (-a, b));
  130. // for (auto& x: goo) dbg (x);
  131. // dbg ("kek");
  132. } else {
  133. int T, k;
  134. cin >> T >> k;
  135. --T;
  136. cout << get (goo[T], 1, 2e5, k) << '\n';
  137. }
  138. }
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement