제출 #363226

#제출 시각아이디문제언어결과실행 시간메모리
363226negar_aFish (IOI08_fish)C++17
100 / 100
1255 ms65536 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef long double ld;
#define pb push_back
#define mp make_pair
#define pii pair <int, int>
#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define F first
#define S second
#define debug(); cerr <<"bug!"<<endl; 
 
const int maxn = 5e5 + 2;
int l[maxn], t[maxn];
int ind[maxn], big[maxn];
vector <int> vec[maxn];
vector <int> bigs;
vector <pii> v;
ll seg[maxn * 4], c[maxn];
int f, k, m;
 
int sum(ll x, ll y){
	return (x % m + y % m) % m;
//	return x + y;
}
int mul(ll x, ll y){
	return (1LL * x % m * y % m) % m;
//	return x * y;
}
void add(int l, int r, int ind, int x){
	if(l + 1 >= r){
		seg[x] = sum(seg[x], 1);
		return;
	}
	int mid = (l + r) / 2;
	if(ind < mid){
		add(l, mid, ind, x * 2);
	}else{
		add(mid, r, ind, x * 2 + 1);
	}
	seg[x] = mul(seg[x * 2], seg[x * 2 + 1]);
}
ll get(int l, int r, int L, int R, int x){
	if(l >= R || r <= L){
		return (ll)1;
	}
	if(l >= L && r <= R){
		return seg[x] % m;
	}
	int mid = (l + r) / 2;
	return mul(get(l, mid, L, R, x * 2), get(mid, r, L, R, x * 2 + 1));
}
int pt = 0;
void upd_c(int x, int i){
	while(l[v[pt].S] * 2 <= l[x]){
		int y = v[pt].S; 
		c[t[y]] ++;
		add(0, k, ind[t[y]], 1);
		pt ++;
	}
}
int find_ind(int le, int x, int r = k){
	while(le + 1 < r){
		int mid = (le + r) / 2;
		int f = bigs[mid];
		int y = v[f].S;
		if(l[y] < l[v[x].S] * 2){
			le = mid;
		}else{
			r = mid;
		}
	}
	return r;
}
 
int main(){
	fast_io;
	fill(seg, seg + maxn * 4, 1);
	fill(c, c + maxn, 1);
	
	cin >> f >> k >> m;
	for(int i = 0; i < f; i ++){
		cin >> l[i] >> t[i];
		v.pb({l[i], i});
		big[t[i]] = -1;
	}
	sort(v.begin(), v.end());
	
	for(int i = 0; i < f; i ++){
		vec[t[v[i].S]].pb(i);
	}
	int num = 0;
	for(int i = f - 1; i >= 0; i --){
		if(big[t[v[i].S]] == -1){
			big[t[v[i].S]] = i;
			ind[t[v[i].S]] = k - num - 1;
			bigs.pb(i);
			num ++;
		}
	}
	reverse(bigs.begin(), bigs.end());
	ll ans = 0;
 
	for(int i = 0; i < f; i ++){
		int x = v[i].S;
		upd_c(x, i);
		if(big[t[x]] == i){
			ll p = get(0, k, 0, ind[t[x]], 1);
			int in = find_ind(ind[t[x]], vec[t[x]][c[t[x]] - 1]);
			ll val = get(0, k, ind[t[x]] + 1, in, 1);
			ll v1 = mul(p, c[t[x]] - 1);
			ll v2 = mul(val, p);
			ans = sum(ans, sum(v1, v2));
		}
	}
	cout << ans % m;
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...