Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define all(X) (X).begin(), (X).end()
- #define ll long long
- #define fir first
- #define sec second
- #define pb push_back
- #ifdef DEBUG
- #define deb(X) X
- #define log(X) cout << X << "\n"
- #define dump(X) cout << __LINE__ << "L: [" << #X << "] = " << X << "\n"
- #else
- #define deb(X)
- #define log(X)
- #define dump(X)
- #endif // DEBUG
- using namespace std;
- const int nmax = 1e6;
- vector<vector<ll>> g;
- vector<vector<ll>> g1;
- pair<ll, ll> dfs (ll v, vector<vector<ll>>& graph, map<ll, pair<ll, ll>>& mp) {
- if (graph[v].size() == 0) {
- return {mp[v].fir, mp[v].sec};
- }
- for (ll i = 0; i < graph[v].size(); i++) {
- ll to = graph[v][i];
- auto q = dfs(to, graph, mp);
- mp[v].fir = min(mp[v].fir, q.fir);
- mp[v].sec = max(mp[v].sec, q.sec);
- }
- return mp[v];
- }
- int main() {
- #ifndef DEBUG
- freopen("volunteers.in", "r", stdin);
- freopen("volunteers.out","w",stdout);
- #endif
- ll n, m, k; cin >> n >> m >> k;
- g.resize(m);
- g1.resize(k);
- map<ll, pair<ll, ll>> mp;
- map<ll, pair<ll, ll>> mp1;
- for (ll i = 0; i < n; i++) {
- ll q, z; cin >> q >> z;
- q--; z--;
- if (mp.count(q) == 0)
- mp[q] = {i, i};
- else {
- mp[q].fir = min(i, mp[q].fir);
- mp[q].sec = max(i, mp[q].sec);
- }
- if (mp1.count(z) == 0)
- mp1[z] = {i, i};
- else {
- mp1[z].fir = min(i, mp1[z].fir);
- mp1[z].sec = max(i, mp1[z].sec);
- }
- }
- for (ll i = 0; i < m - 1; i++) {
- ll q; cin >> q;
- g[q - 1].pb(i);
- }
- for (ll i = 0; i < k - 1; i++) {
- ll q; cin >> q;
- g1[q - 1].pb(i);
- }
- dfs(m - 1, g, mp);
- dfs(k - 1, g1, mp1);
- vector<pair<pair<ll, ll>, ll>> pox;
- for (auto i: mp) {
- // dump(i.fir);
- // dump(i.sec.fir);
- // dump(i.sec.sec);
- pox.pb({{i.sec.fir, 0}, 0});
- pox.pb({{i.sec.sec, 1}, 0});
- }
- for (auto i: mp1) {
- // dump(i.fir);
- // dump(i.sec.fir);
- // dump(i.sec.sec);
- pox.pb({{i.sec.fir, 0}, 1});
- pox.pb({{i.sec.sec, 1}, 1});
- }
- sort(all(pox));
- ll u = 0, v = 0, cnt = 0;
- for (ll i = 0; i < pox.size(); i++) {
- auto q = pox[i];
- dump(q.fir.fir);
- dump(q.fir.sec);
- dump(q.sec);
- if (q.fir.sec == 1) {
- if (q.sec == 0)
- u--;
- else
- v--;
- continue;
- }
- if (q.sec == 0) {
- u++;
- cnt += v;
- } else {
- v++;
- cnt += u;
- }
- }
- cout << cnt;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement