#include using namespace std; static const long long MOD = 998244353; long long modpow(long long a, long long e) { long long r = 1 % MOD; while (e) { if (e & 1) r = r * a % MOD; a = a * a % MOD; e >>= 1; } return r; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, M, L; cin >> N >> M >> L; vector A(N), B(N); for(int i = 0; i < N; i++){ cin >> A[i] >> B[i]; --A[i]; B[i] -= (M + 1); // coder 側を 0-index } vector freqA(M, 0), freqB(L, 0); vector> c(M, vector(L, 0)); for(int i = 0; i < N; i++){ freqA[A[i]]++; freqB[B[i]]++; c[A[i]][B[i]]++; } // 2^k と逆元 vector pow2(N + 1), invpow2(N + 1); for(int i = 0; i <= N; i++){ pow2[i] = modpow(2, i); invpow2[i] = modpow(pow2[i], MOD - 2); } int SZ = 1 << M; vector sumA(SZ, 0); for(int s = 1; s < SZ; s++){ int lb = __builtin_ctz(s); sumA[s] = sumA[s ^ (1 << lb)] + freqA[lb]; } long long ans = 0; for(int mask = 0; mask < SZ; mask++){ int bits = __builtin_popcount(mask); vector t(L, 0); for(int a = 0; a < M; a++){ if(mask & (1 << a)){ for(int b = 0; b < L; b++){ t[b] += c[a][b]; } } } long long cur = pow2[N - sumA[mask]]; for(int b = 0; b < L; b++){ long long factor = (1 - pow2[t[b]] * invpow2[freqB[b]] % MOD + MOD) % MOD; cur = cur * factor % MOD; } if(bits & 1) ans = (ans - cur + MOD) % MOD; else ans = (ans + cur) % MOD; } cout << ans << "\n"; return 0; }