OI XXII - log

// https://szkopul.edu.pl/problemset/problem/ShrCwRqlzMKLBb269GkVbWg_/site/?key=statement

#include <bits/stdc++.h>

using namespace std;
#define int long long
constexpr int sizik = 1000 * 1001, INF = 1e9 + 7;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef long long ll;
typedef vec<vec<int>> _kra;
typedef ar<int, 4 * sizik> DD;

DD d, d1;

struct DrzewoPrzedzialowe {
    int ll = 1;

    int op(const int& a, const int& b) { return a + b; }

    int na_przedziale(int o, int x, int y, int A, int B, DD& local_d) {
        if (A <= x && y <= B) {
            return local_d[o];
        } else if (B < x || y < A) {
            return 0;
        } else {
            return op(na_przedziale(o * 2, x, (x + y) / 2, A, B, local_d), na_przedziale(o * 2 + 1, (x + y) / 2 + 1, y, A, B, local_d));
        }
    }

    int na_przedziale(int A, int B, DD& local_d) {
        if (B < A) return 0;
        if (A == B) return local_d[A + ll - 1];
        return na_przedziale(1, 1, ll, A, B, local_d);
    }

    void akt(int v, const int& a, DD& local_d) {
        v += this->ll - 1;
        local_d[v] = a;
        while (v > 1) {
            v /= 2;
            local_d[v] = op(local_d[2 * v], local_d[2 * v + 1]);
        }
    }

    DrzewoPrzedzialowe(int n, DD& local_d) {
        while (ll < n) {
            ll *= 2;
        }

        for (int i = 0; i <= 2 * ll; i++) {
            local_d[i] = 0;
        }

        for (int i = 0; i < n; i++) {
            local_d[i + ll] = 0;
        }
    }

    void wypisz(const DD& local_d) {}
};

ar<int, 3> zapyt[sizik];
int cier[sizik], bigger;

void solve() {
    int n, m;
    std::cin >> n >> m;

    std::set<int> ss;
    ss.insert(INF);
    ss.insert(0);

    for (int i = 0; i < m; i++) {
        char a;
        int b, c;
        std::cin >> a >> zapyt[i + 1][1] >> zapyt[i + 1][2];

        int d = (a == 'U') ? 1 : 2;
        zapyt[i + 1][0] = d;

        if (a == 'Z') {
            ss.insert(zapyt[i + 1][2]);
        }
    }

    std::map<int, int> mp;

    int _o = 1;
    for (const auto& a : ss) {
        mp[a] = _o++;
    }

    DrzewoPrzedzialowe dd(_o, d), dd1(_o, d1);
    dd1.akt(1, n, d1);

    for (int i = 1; i <= m; i++) {
        const auto& [t, a, b] = zapyt[i];

        if (t == 1) {
            // a-ty kierowca może b km

            int val = *ss.lower_bound(cier[a]), val1 = *ss.lower_bound(b);
            int index = mp[val], index1 = mp[val1];

            dd.akt(index, dd.na_przedziale(index, index, d) - cier[a], d);
            dd1.akt(index, dd1.na_przedziale(index, index, d1) - 1, d1);

            if (cier[a] == 0 && b != 0) {
                bigger++;
            } else if (cier[a] != 0 && b == 0) {
                bigger--;
            }

            cier[a] = b;

            dd.akt(index1, dd.na_przedziale(index1, index1, d) + b, d);
            dd1.akt(index1, dd1.na_przedziale(index1, index1, d1) + 1, d1);
        } else if (t == 2) {
            auto c = ss.upper_bound(b);
            c--;

            int index = mp[*c];

            int su1 = dd.na_przedziale(2, index, d);
            int su2 = (bigger - dd1.na_przedziale(2, index, d1)) * b;

            int xs = su1 + su2;

            if (xs >= a * b) {
                std::cout << "TAK\n";
            } else {
                std::cout << "NIE\n";
            }
        }
    }
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}