#include <bits/stdc++.h>
using namespace std;
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
#define int int64_t
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const int64_t inf = 1e18;
int n, k, m, N;
vector<int> t, cnt, longest, v[500005];
void build() {
for (int i = 0; i < N; i++) t[i + N] = (cnt[i] + 1) % m;
for (int i = N - 1; i > 0; i--) t[i] = t[i << 1] * t[i << 1 | 1] % m;
}
void update(int p, int val) {
t[p += N] = val % m;
for (p >>= 1; p > 0; p >>= 1) t[p] = t[p << 1] * t[p << 1 | 1] % m;
}
int query(int l, int r) {
int res = 1;
for (l += N, r += N; l < r; l >>= 1, r >>= 1) {
if (l & 1) (res *= t[l++]) % m;
if (r & 1) (res *= t[--r]) % m;
}
return res;
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin.exceptions(cin.failbit);
// freopen("D:\\input.inp", "r", stdin);
// freopen("D:\\output.out", "w", stdout);
cin >> n >> k >> m;
for (int i = 0; i < n; i++) {
int x, y; cin >> x >> y;
v[--y].emplace_back(x);
}
for (int i = 0; i < k; i++) sort(all(v[i]));
sort(v, v + k, [](vector<int>& a, vector<int>& b) {
return a.back() > b.back();
});
for (int i = k - 1; ~i; i--) longest.emplace_back(v[i].back());
cnt.assign(k, 0);
for (int i = 0; i < k; i++) cnt[i] = sz(v[i]);
N = k;
t.assign(N << 1, 1);
build();
priority_queue<pair<int, int>> pq;
for (int i = 0; i < k; i++) {
for (int x : v[i]) {
pq.emplace(x, i);
}
}
vector<vector<int>> dp(k, vector<int>(2, 0));
for (int i = 0; i < k; i++) {
int mxlen = v[i].back();
while (sz(pq) && pq.top().first > (mxlen >> 1)) {
auto [len, st] = pq.top(); pq.pop();
cnt[st]--;
update(st, cnt[st] + 1);
}
int c = upper_bound(all(v[i]), mxlen >> 1) - v[i].begin();
dp[i][0] = 1; // ko chon
dp[i][1] = c; // chon 1 thang i
dp[i][0] = dp[i][0] * query(i + 1, k) % m;
dp[i][1] = dp[i][1] * query(i + 1, k) % m;
if (c) {
int val = v[i][c - 1];
int idx = lower_bound(all(longest), val << 1) - longest.begin();
int L = k - idx, R = i - 1;
dp[i][0] = dp[i][0] * query(L, R + 1) % m;
}
}
int ans = 0;
for (int i = 0; i < k; i++) ans = (ans + dp[i][0] + dp[i][1]) % m;
cout << ans << '\n';
cerr << '\n' << "Times: " << TIME << "s." << '\n';
return 0;
}