Submission #567556

#TimeUsernameProblemLanguageResultExecution timeMemory
567556RealSnakeBitaro’s Party (JOI18_bitaro)C++14
0 / 100
2102 ms498252 KiB
#include "bits/stdc++.h"
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<pair<int, int>, null_type, less<pair<int,int>>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

#define ll long long
#define mod 1000000007

ofstream fout(".out");
ifstream fin(".in");

vector<int> par[100001];
vector<pair<int, int>> v[100001];
int dis[100001][501], city[100001][501], b[100001], diss[100001];

signed main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m, q;
    cin >> n >> m >> q;
    for(int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        par[v].push_back(u);
    }
    int sqr = sqrt(n);
    for(int i = 1; i <= n; i++) {
        v[i].push_back({0, i});
        for(int j : par[i]) {
            int sz = v[j].size();
            for(int k = 0; k < sz; k++) {
                int d = v[j][k].first, c = v[j][k].second;
                v[i].push_back({d, c});
            }
        }
        sort(v[i].rbegin(), v[i].rend());
        int sz = v[i].size(), szz = 0;
        for(int j = 0; j < sz; j++) {
            int d = v[i][j].first, c = v[i][j].second;
            if(b[c] != i) {
                b[c] = i;
                dis[i][szz] = d;
                city[i][szz] = c;
                szz++;
                if(szz == sqr + 1)
                    break;
            }
        }
    }
    int o = -1e9;
    while(q--) {
        int t, sz;
        cin >> t >> sz;
        for(int i = 0; i < sz; i++) {
            int x;
            cin >> x;
            diss[x] = o;
        }
        if(t > sqr) {
            for(int i = 1; i <= t; i++) {
                if(diss[i] != o)
                    diss[i] = 0;
                for(int j : par[i])
                    diss[i] = max(diss[i], diss[j] + 1);
            }
            if(diss[t] < 0)
                diss[t] = -1;
            cout << diss[t] << "\n";
            o += n + 1;
            continue;
        }
        int ans = -1;
        for(int i = 0; i <= sqr; i++) {
            if(!city[t][i])
                break;
            if(diss[city[t][i]] != o) {
                ans = dis[t][i];
                break;
            }
        }
        o++;
        cout << ans << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...