#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
const int F = 500005, K = F;
int f, k, mo, z, c[K];
array<int, 2> a[F];
set<int> s[K];
struct oo {
oo() {
l = r = 0;
x = 1;
}
oo *l, *r;
int x;
void P() {
int lx = (!l ? 1 : l->x);
int rx = (!r ? 1 : r->x);
x = lx * rx % mo;
}
} *root;
void upd(int i, int x, int l = 1, int r = k, oo *&t = root) {
if(!t) t = new oo();
if(l == r) {
t->x = x;
return;
}
int m = l + r >> 1;
if(m >= i) upd(i, x, l, m, t->l);
else upd(i, x, m + 1, r, t->r);
t->P();
}
void updc(int g) {
upd(g, c[g] + 1);
}
int x(int sl, int sr, int l = 1, int r = k, oo *&t = root) {
if(l > sr || r < sl || !t) return 1;
if(l >= sl && r <= sr) return t->x;
int m = l + r >> 1;
return x(sl, sr, l, m, t->l) * x(sl, sr, m + 1, r, t->r) % mo;
}
void moz(int i) {
while(a[z][0] * 2 > a[i][0]) {
c[a[z][1]] -= 1;
updc(a[z][1]);
z -= 1;
}
while(a[z + 1][0] * 2 <= a[i][0]) {
z += 1;
c[a[z][1]] += 1;
updc(a[z][1]);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
#ifdef x
freopen("x.txt", "r", stdin);
#endif
cin >> f >> k >> mo;
for(int i = 1; i <= f; ++i) {
cin >> a[i][0] >> a[i][1];
}
a[f + 1][0] = 2e9;
a[f + 1][1] = k + 1;
sort(a + 1, a + f + 1);
vector<int> smxf(f + 2, 0);
smxf[f + 1] = k + 1;
{
vector<int> fg(k + 1, 0);
int kg = k;
for(int i = f; i >= 1; --i) {
if(!fg[a[i][1]]) {
fg[a[i][1]] = kg;
kg -= 1;
}
}
for(int i = 1; i <= f; ++i) {
a[i][1] = fg[a[i][1]];
s[a[i][1]].insert(i);
}
vector<bool> fasd(f + 1, 0);
for(int i = f; i >= 1; --i) {
smxf[i] = smxf[i + 1];
if(!fasd[a[i][1]]) {
fasd[a[i][1]] = 1;
smxf[i] = a[i][1];
}
}
}
moz(f);
int fp = x(1, k);
vector<bool> xm(k + 1);
xm[k] = 1;
for(int i = f - 1; i >= 1; --i) {
if(!xm[a[i][1]]) {
xm[a[i][1]] = 1;
moz(i);
upd(a[i][1], c[a[i][1]]);
(fp += x(1, a[i][1])) %= mo;
updc(a[i][1]);
int y = *s[a[i][1]].upper_bound(z);
int l = y + 1, r = f + 1;
while(l < r) {
int m = l + r >> 1;
if(a[y][0] * 2 <= a[m][0]) r = m;
else l = m + 1;
}
int ff = smxf[l];
fp += x(1, a[i][1] - 1) * x(a[i][1] + 1, ff - 1) % mo;
// cout << x(1, a[i][1] - 1) << endl;
// cout << x(a[i][1] + 1, ff - 1) << endl;
fp %= mo;
}
}
cout << fp << endl;
return 0;
}
Compilation message
fish.cpp: In function 'void upd(int, int, int, int, oo*&)':
fish.cpp:33:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
33 | int m = l + r >> 1;
| ~~^~~
fish.cpp: In function 'int x(int, int, int, int, oo*&)':
fish.cpp:46:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
46 | int m = l + r >> 1;
| ~~^~~
fish.cpp: In function 'int main()':
fish.cpp:114:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
114 | int m = l + r >> 1;
| ~~^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
23816 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23712 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
11 ms |
23764 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
13 ms |
23836 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
23824 KB |
Output is correct |
2 |
Correct |
324 ms |
53468 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
23892 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
24032 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
147 ms |
35764 KB |
Output is correct |
2 |
Correct |
179 ms |
38720 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24064 KB |
Output is correct |
2 |
Correct |
16 ms |
24276 KB |
Output is correct |
3 |
Correct |
17 ms |
24128 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
237 ms |
41780 KB |
Output is correct |
2 |
Incorrect |
373 ms |
53476 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
323 ms |
53580 KB |
Output is correct |
2 |
Correct |
407 ms |
53792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
174 ms |
41936 KB |
Output is correct |
2 |
Correct |
421 ms |
53856 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
455 ms |
51308 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
514 ms |
54616 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
237 ms |
50872 KB |
Output is correct |
2 |
Correct |
506 ms |
61308 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
746 ms |
62260 KB |
Output is correct |
2 |
Correct |
504 ms |
51788 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
624 ms |
60468 KB |
Output is correct |
2 |
Correct |
712 ms |
62196 KB |
Output is correct |
3 |
Runtime error |
350 ms |
65536 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
410 ms |
65536 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |