//* #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") //*/ #include // #include // #include using namespace std; // using namespace atcoder; // #define _GLIBCXX_DEBUG #define DEBUG(x) cerr << #x << ": " << x << endl; #define DEBUG_VEC(v) \ cerr << #v << ":"; \ for (int iiiiiiii = 0; iiiiiiii < v.size(); iiiiiiii++) \ cerr << " " << v[iiiiiiii]; \ cerr << endl; #define DEBUG_MAT(v) \ cerr << #v << endl; \ for (int iv = 0; iv < v.size(); iv++) { \ for (int jv = 0; jv < v[iv].size(); jv++) { \ cerr << v[iv][jv] << " "; \ } \ cerr << endl; \ } typedef long long ll; // #define int ll #define vi vector #define vl vector #define vii vector> #define vll vector> #define vs vector #define pii pair #define pis pair #define psi pair #define pll pair template pair operator+(const pair &s, const pair &t) { return pair(s.first + t.first, s.second + t.second); } template pair operator-(const pair &s, const pair &t) { return pair(s.first - t.first, s.second - t.second); } template ostream &operator<<(ostream &os, pair p) { os << "(" << p.first << ", " << p.second << ")"; return os; } #define X first #define Y second #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rep1(i, n) for (int i = 1; i <= (int)(n); i++) #define rrep(i, n) for (int i = (int)(n)-1; i >= 0; i--) #define rrep1(i, n) for (int i = (int)(n); i > 0; i--) #define REP(i, a, b) for (int i = a; i < b; i++) #define in(x, a, b) (a <= x && x < b) #define all(c) c.begin(), c.end() void YES(bool t = true) { cout << (t ? "YES" : "NO") << endl; } void Yes(bool t = true) { cout << (t ? "Yes" : "No") << endl; } void yes(bool t = true) { cout << (t ? "yes" : "no") << endl; } void NO(bool t = true) { cout << (t ? "NO" : "YES") << endl; } void No(bool t = true) { cout << (t ? "No" : "Yes") << endl; } void no(bool t = true) { cout << (t ? "no" : "yes") << endl; } template bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; } template bool chmin(T &a, const T &b) { if (a > b) { a = b; return 1; } return 0; } #define UNIQUE(v) v.erase(std::unique(v.begin(), v.end()), v.end()); const ll inf = 1000000001; const ll INF = (ll)1e18 + 1; const long double pi = 3.1415926535897932384626433832795028841971L; int popcount(ll t) { return __builtin_popcountll(t); } // int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; // int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 }; vi dx = {0, 0, -1, 1}, dy = {-1, 1, 0, 0}; vi dx2 = {1, 1, 0, -1, -1, -1, 0, 1}, dy2 = {0, 1, 1, 1, 0, -1, -1, -1}; struct Setup_io { Setup_io() { ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); cout << fixed << setprecision(25); } } setup_io; // const ll MOD = 1000000007; const ll MOD = 998244353; // #define mp make_pair //#define endl '\n' //最小値クエリ //INFの値によってはすぐオーバーフローするので注意(|ab| < LLONG_MAX/4) //非順序add非順序query //http://d.hatena.ne.jp/sune2/20140310/1394440369 struct CHT2 { CHT2() { // 番兵 S.insert({L(INF, 0), L(-INF, 0)}); C.insert(cp(L(INF, 0), L(-INF, 0))); } // for debug void print() { cout << "S : "; for (auto it : S) printf("(%lld,%lld)", it.a, it.b); puts(""); cout << "C : "; for (auto it : C) printf("(%lld,%lld)", it.n, it.d); puts(""); } // |ab| < LLONG_MAX/4 ??? void add(ll a, ll b) { const L p(a, b); It pos = S.insert(p).first; if (check(*it_m1(pos), p, *it_p1(pos))) { // 直線(a,b)が不要 S.erase(pos); return; } C.erase(cp(*it_m1(pos), *it_p1(pos))); { // 右方向の削除 It it = it_m1(pos); while (it != S.begin() && check(*it_m1(it), *it, p)) --it; C_erase(it, it_m1(pos)); S.erase(++it, pos); pos = S.find(p); } { // 左方向の削除 It it = it_p1(pos); while (it_p1(it) != S.end() && check(p, *it, *it_p1(it))) ++it; C_erase(++pos, it); S.erase(pos, it); pos = S.find(p); } C.insert(cp(*it_m1(pos), *pos)); C.insert(cp(*pos, *it_p1(pos))); } ll query(ll x) { const L &p = (--C.lower_bound(CP(x, 1, L(0, 0))))->p; return p.a * x + p.b; } private: template T it_p1(T a) { return ++a; } template T it_m1(T a) { return --a; } struct L { ll a, b; L(ll a, ll b) : a(a), b(b) {} bool operator<(const L &rhs) const { return a != rhs.a ? a > rhs.a : b < rhs.b; } }; struct CP { ll n, d; L p; CP(ll _n, ll _d, const L &p) : n(_n), d(_d), p(p) { if (d < 0) { n *= -1; d *= -1; } }; bool operator<(const CP &rhs) const { if (n == INF || rhs.n == -INF) return 0; if (n == -INF || rhs.n == INF) return 1; return n * rhs.d < rhs.n * d; } }; set S; set C; typedef set::iterator It; void C_erase(It a, It b) { for (It it = a; it != b; ++it) C.erase(cp(*it, *it_p1(it))); } CP cp(const L &p1, const L &p2) { if (p1.a == INF) return CP(-INF, 1, p2); if (p2.a == -INF) return CP(INF, 1, p2); return CP(p1.b - p2.b, p2.a - p1.a, p2); } bool check(const L &p1, const L &p2, const L &p3) { if (p1.a == p2.a && p1.b <= p2.b) return 1; if (p1.a == INF || p3.a == -INF) return 0; return (p2.a - p1.a) * (p3.b - p2.b) >= (p2.b - p1.b) * (p3.a - p2.a); } }; signed main() { // 多分通らない int a; cin >> a; int q; cin >> q; CHT2 cht; int cnt = 0; while (q--) { int ty; cin >> ty; if (ty == 1) { ll s, t; cin >> s >> t; ll b = (t - s) * a; cnt++; cht.add(-2 * a * s - b, a * s * s + b * s); } else { if (cnt == 0) { cout << 0 << endl; continue; } ll t; cin >> t; ll mi = cht.query(t); ll ans = -mi; ans -= a * t * t; if (ans <= 0) { cout << 0 << endl; } else { cout << ans << endl; } } } }