Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
- // #pragma comment(linker, "/stack:200000000"]
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <algorithm>
- #include <unordered_set>
- #include <unordered_map>
- #include <set>
- #include <map>
- #include <queue>
- #include <deque>
- #include <bitset>
- #include <stack>
- #include <random>
- #include <fstream>
- #include <sstream>
- #include <chrono>
- #define fi first
- #define se second
- #define pb push_back
- #define ll long long
- #define ld long double
- #define hm unordered_map
- #define pii pair<int, int>
- #define sz(a) (int)a.size()
- #define all(a) a.begin(), a.end()
- #define cinv(v) for (auto& x: v) cin >> x
- #define fr(i, n) for (int i = 0; i < n; ++i)
- #define fl(i, l, n) for (int i = l; i < n; ++i)
- #define int ll
- using namespace std;
- #ifdef __LOCAL
- #define dbg(x) cerr << #x << " : " << x << '\n'
- const int maxn = 20;
- #else
- #define dbg(x)
- const int maxn = 2e5 + 20;
- #endif
- //tg: @galebickosikasa
- const ll inf = (ll) 2e9;
- const ld pi = asin (1) * 2;
- const ld eps = 1e-8;
- const ll mod = (ll)1e9 + 7;
- const ll ns = 97;
- mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
- struct Line {
- int a, b;
- Line (int a = -inf, int b = 0) : a(a), b(b) {}
- int get (int x) {
- return a + x * b;
- }
- };
- struct Node {
- Node* l;
- Node* r;
- Line line;
- Node (Node* l, Node* r, Line t) : l(l), r(r), line(t) {}
- Node () {
- l = r = nullptr;
- line = Line ();
- }
- int get (int x) {
- return line.get (x);
- }
- };
- Node* upd (Node* t, int left, int right, Line l) {
- int mid = (right + left) / 2;
- if (t == nullptr) t = new Node ();
- int m = t->get (mid) < l.get (mid);
- int L = t->get (left) < l.get (left);
- Node* N = new Node (t->l, t->r, t->line);
- if (m) swap (N->line, l);
- if (left == right) return N;
- if (m != L) N->l = upd (N->l, left, (left + right) / 2, l);
- else N->r = upd (N->r, (right + left) / 2 + 1, right, l);
- return N;
- }
- int get (Node* t, int left, int right, int x) {
- if (t == nullptr) return -inf;
- // dbg (t);
- // dbg (t->line.a);
- // dbg (t->line.b);
- if (left == right) return t->get (x);
- int mid = (right + left) / 2;
- if (x <= mid) return max (t->get (x), get (t->l, left, (left + right) / 2, x));
- else return max (t->get (x), get (t->r, (left + right) / 2 + 1, right, x));
- }
- signed main () {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- int n, q;
- cin >> n >> q;
- vector <Node*> goo (n, nullptr);
- while (q--) {
- char t;
- cin >> t;
- if (t == '#') {
- int a, b;
- cin >> a >> b;
- --a, --b;
- goo[b] = goo[a];
- } else if (t == '+') {
- int T, a, b;
- cin >> T >> a >> b;
- --T;
- goo[T] = upd (goo[T], 1, 2e5, Line (-a, b));
- // for (auto& x: goo) dbg (x);
- // dbg ("kek");
- } else {
- int T, k;
- cin >> T >> k;
- --T;
- cout << get (goo[T], 1, 2e5, k) << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement