# gpt5.2で編集しました import sys MOD = 998244353 def main(): input = sys.stdin.buffer.readline N, M, L = map(int, input().split()) cnt = [[0] * L for _ in range(M)] for _ in range(N): A, B = map(int, input().split()) cnt[A - 1][(B - M) - 1] += 1 S = 1 << L mod = MOD f = [0] * S f[0] = 1 POW2 = [1] * (N + 1) for x in range(N): POW2[x + 1] = (POW2[x] * 2) % mod for i in range(M): g = [0] * S g[0] = 1 cnt_i = cnt[i] for j in range(L): bit = 1 << j t = POW2[cnt_i[j]] - 1 if t < 0: t += mod g_old = g g = [0] * S for x, go in enumerate(g_old): v = g[x] + go if v >= mod: v -= mod g[x] = v add = (go * t) % mod xb = x | bit v = g[xb] + add if v >= mod: v -= mod g[xb] = v g[0] = 0 # zeta transform add (f, g) y = 1 while y < S: step = y << 1 for base in range(0, S, step): end = base + y for x in range(base, end): dst = x + y # x|y と同じ(x&y==0 が保証される走査) v = f[dst] + f[x] if v >= mod: v -= mod f[dst] = v v = g[dst] + g[x] if v >= mod: v -= mod g[dst] = v y = step # pointwise multiply for x in range(S): f[x] = (f[x] * g[x]) % mod # mobius inversion y = 1 while y < S: step = y << 1 for base in range(0, S, step): end = base + y for x in range(base, end): dst = x + y v = f[dst] - f[x] if v < 0: v += mod f[dst] = v y = step print(f[S - 1] % mod) if __name__ == "__main__": main()