func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 5e5 + 5, Mod = 998244353;   char buf[1 << 12], *pp1 = buf, *pp2 = buf, nc;   int ny;   inline char gc() {     return pp1 == pp2 &&                    (pp2 = (pp1 = buf) + fread(buf, 1, 1 << 12, stdin), pp1 == pp2)                ? EOF                : *pp1++;   }   inline int read() {     int x = 0;     for (ny = 1; nc = gc(), (nc < 48 || nc > 57) && nc != EOF;)       if (nc == 45) ny = -1;     if (nc < 0) return nc;     for (x = nc - 48; nc = gc(), 47 < nc && nc < 58 && nc != EOF;          x = (x << 3) + (x << 1) + (nc ^ 48))       ;     return x * ny;   }   int n, k, m, ans = 1, s[MAXN], Mn[MAXN], l[MAXN], r[MAXN], c[MAXN], f[MAXN],                q[MAXN], head, tail;   inline void add(int& x, int y) { x += y, x >= Mod ? x -= Mod : 0; }   inline void sub(int& x, int y) { x -= y, x < 0 ? x += Mod : 0; }   inline int Solve(int k) {     memset(s, 0, sizeof(s));     for (int i = 1; i <= n; i++) Mn[i] = n + 1;     for (int i = 1; i <= m; i++) {       if (c[i] >> k & 1)         s[l[i]]++, s[r[i] + 1]--;       else         Mn[l[i]] = min(Mn[l[i]], r[i]);     }     for (int i = 1; i <= n; i++) s[i] += s[i - 1];     memset(f, 0, sizeof(f)), f[n + 1] = 1, q[head = tail = 1] = n + 1;     int sum = 1;     for (int i = 1; i <= n; i++) {       int tmp = 0;       for (; q[tail] >= Mn[i] && head <= tail;            add(tmp, f[q[tail]]), f[q[tail]] = 0, tail--)         ;       for (f[Mn[i]] = tmp, q[++tail] = Mn[i]; q[head] < i && head <= tail;            sub(sum, f[q[head]]), head++)         ;       if (!s[i]) add(f[n + 1], sum), sum = 2 * sum % Mod;       (q[tail] != n + 1 ? q[++tail] = n + 1 : 0);     }     return f[n + 1];   }   int main() {     n = read(), k = read(), m = read();     for (int i = 1; i <= m; i++) l[i] = read(), r[i] = read(), c[i] = read();     for (int i = 0; i <= k - 1; i++) ans = 1ll * ans * Solve(i) % Mod;     cout << ans <<   n ;     return 0;   }   