Submission #1128931

#TimeUsernameProblemLanguageResultExecution timeMemory
1128931antonnBitaro’s Party (JOI18_bitaro)C++20
0 / 100
3 ms840 KiB
#include <bits/stdc++.h>


using namespace std;


#define ll long long
#define ld long double
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()


const int K = 320;


int n, m, q;
vector<vector<int>> g, gg;
vector<vector<pair<int, int>>> closest;
vector<int> vis, ord, dp;


void dfs(int u) {
    vis[u] = 1;
    for (auto v : g[u]) {
        if (!vis[v]) {
            dfs(v);
        }
    }
    ord.push_back(u);
}


vector<bool> in;


void merge(vector<pair<int, int>> &a, vector<pair<int, int>> b) {
    for (int i = 0; i < b.size(); i += 1) {
        b[i].first += 1;
    }
    vector<pair<int, int>> c;
    int i = 0;
    int j = 0;
    while (i < a.size() || j < b.size()) {
        if (i == a.size()) {
            c.push_back(b[j]);
            j += 1;
            continue;
        }
        if (j == b.size()) {
            c.push_back(a[i]);
            i += 1;
            continue;
        }
        if (a[i].first >= b[j].first) {
            c.push_back(a[i]);
            i += 1;
            continue;
        } else {
            c.push_back(b[j]);
            j += 1;
            continue;
        }
    }
    vector<pair<int, int>> f;
    for (int i = 0; i < c.size(); i += 1) {
        if (in[c[i].second] == 1) {
            continue;
        }
        f.push_back({c[i].first, c[i].second});
        in[c[i].second] = 1;
        if (f.size() > K) {
            break;
        }
    }
    for (auto [x, y] : f) {
        in[y] = 0;
    }
    swap(a, f);
}



int32_t main() {
    if (1) {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
	}
	cin >> n >> m >> q;
    g.resize(n + 1);
    gg.resize(n + 1);
    for (int i = 1; i <= m; i += 1) {
        int e, s;
        cin >> e >> s;
        g[e].push_back(s);
        gg[s].push_back(e);
    }
    vis.assign(n + 1, 0);
    for (int i = 1; i <= n; i += 1) {
        if (!vis[i]) {
            dfs(i);
        }
    }
    in.resize(n + 1);
    reverse(all(ord));
    closest.resize(n + 1);
    int when = 0;
    for (auto i : ord) {
        closest[i].push_back({0, i});
        for (auto v : gg[i]) {
            merge(closest[i], closest[v]);
        }
    }
   
    dp.resize(n + 1);
    vector<int> blocked(n + 1, 0);
    for (int iq = 1; iq <= q; iq += 1) {
        int t, y;
        cin >> t >> y;
        vector<int> v;
        for (int j = 0; j < y; j += 1) {
            int x;
            cin >> x;
            v.push_back(x);
            blocked[x] = 1;
        }
        if (y > K) {
            for (int i = 1; i <= n; i += 1) {
                dp[i] = -1;
            }
            dp[t] = 0;
            for (int i = t; i >= 1; i -= 1) {
                for (auto j : gg[i]) {
                    dp[j] = max(dp[j], dp[i] + 1);
                }
            }
            int ans = -1;
            for (int i = 1; i <= n; i += 1) {
                if (blocked[i] == 0) {
                    ans = max(ans, dp[i]);
                }
            }
            cout << ans << "\n";
        } else {
            int ans = -1;
            for (auto i : closest[t]) {
                if (!blocked[i.second]) {
                    ans = i.first;
                    break;
                }
            }
            cout << ans << "\n";
        }
        for (auto i : v) {
            blocked[i] = 0;
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...