OI XXXII - drz

// https://szkopul.edu.pl/problemset/problem/0I18dLrp40xsAiQ-qMLmX-jP/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

constexpr int sizik = 2 * (1 << 20) + 3; // 1048576 nodes for n=20

long long d[sizik][2];
std::string s[2];

long long compute_hash(long long a, long long b) {
    if (a < b) swap(a, b);
    return (a * (a + 1LL)) / 2LL + b;
}

void build(int v, int tl, int tr, int tree_num) {
    if (tl == tr) {
        int c = s[tree_num][tl - 1] - 'a' + 1;
        d[v][tree_num] = (c * (c + 1LL)) / 2LL; // b is 0
    } else {
        int tm = (tl + tr) / 2;
        build(2 * v, tl, tm, tree_num);
        build(2 * v + 1, tm + 1, tr, tree_num);
        long long left = d[2 * v][tree_num];
        long long right = d[2 * v + 1][tree_num];
        d[v][tree_num] = compute_hash(left, right);
    }
}

void update(int v, int tl, int tr, int pos, char c_char, int tree_num) {
    if (tl == tr) {
        int c = c_char - 'a' + 1;
        d[v][tree_num] = (c * (c + 1LL)) / 2LL; // b is 0
    } else {
        int tm = (tl + tr) / 2;
        if (pos <= tm) {
            update(2 * v, tl, tm, pos, c_char, tree_num);
        } else {
            update(2 * v + 1, tm + 1, tr, pos, c_char, tree_num);
        }
        long long left = d[2 * v][tree_num];
        long long right = d[2 * v + 1][tree_num];
        d[v][tree_num] = compute_hash(left, right);
    }
}

bool check() {
    return d[1][0] == d[1][1];
}

int zll;

void check_a_print() {
    if (check()) {
        std::cout << "TAK\n";
    } else {
        std::cout << "NIE\n";
    }
}

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

    std::cin >> s[0] >> s[1];

    zll = 1 << n;

    build(1, 1, zll, 0);
    build(1, 1, zll, 1);

    check_a_print();

    for (; q > 0; q--) {
        int t, k;
        char b;
        std::cin >> t >> k >> b;
        t--;

        update(1, 1, zll, k, b, t);

        check_a_print();
    }
}

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

    int t = 1;
    for (; t > 0; t--) {
        solve();
    }

    return 0;
}