Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define ll long long
- #define eb emplace_back
- #define pb push_back
- #define ppb pop_back
- #define endl '\n'
- #define mii map<ll,ll>
- #define msi map<string,ll>
- #define mis map<ll, string>
- #define rep(i,a,b) for(ll i=a;i<b;i++)
- #define mpi map<pair<ll,ll>,ll>
- #define pii pair<ll,ll>
- #define vi vector<ll>
- #define vpi vector<pair<ll, ll>>
- #define vs vector<string>
- #define all(a) (a).begin(),(a).end()
- #define rall(a) (a).rbegin(),(a).rend()
- #define F first
- #define S second
- #define sz(x) (ll)x.size()
- #define hell 1000000007
- #define lbnd lower_bound
- #define ubnd upper_bound
- #define bs binary_search
- #define mp make_pair
- #define what_is(x) cerr << #x << " is " << x << endl;
- #define time cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
- using namespace std;
- #define N 100005
- ll max(ll n, ll m)
- {
- if(n >= m)
- return n;
- else
- return m;
- }
- ll min(ll n, ll m)
- {
- if(n <= m)
- return n;
- else
- return m;
- }
- void digest(vi &v, ll n)
- {
- ll elem;
- rep(i,0,n)
- {
- cin>>elem;
- v.eb(elem);
- }
- }
- void vomit(vi &v, ll a, ll b)
- {
- rep(i,a,b)
- cout<<v.at(i)<<" ";
- cout<<"\n";
- }
- vi v[N];
- vi visited(N,-1);
- vi level(N,-1);
- ll timer = 0;
- vi intime(N+100);
- vi outtime(N+100);
- void bfs(ll src)
- {
- level.at(src) = 0;
- queue <ll> q;
- q.emplace(src);
- visited.at(src) = 1;
- ll elem;
- while(!q.empty())
- {
- elem = q.front();
- q.pop();
- rep(i,0,v[elem].size())
- {
- if(visited.at(v[elem].at(i)) == -1)
- {
- q.emplace(v[elem].at(i));
- visited.at(v[elem].at(i)) = 1;
- level.at(v[elem].at(i)) = level.at(elem)+1;
- }
- }
- }
- }
- void dfs(ll node)
- {
- visited.at(node) = 1;
- ++timer;
- intime.at(node) = timer;
- rep(i,0,v[node].size())
- {
- if(visited.at(v[node].at(i)) == -1 )
- dfs(v[node].at(i));
- }
- ++timer;
- outtime.at(node) = timer;
- }
- int solve()
- {
- ll n;
- cin>>n;
- ll elem,src;
- rep(i,1,n+1)
- {
- cin>>elem;
- if(elem != 0)
- {
- v[elem].eb(i);
- v[i].eb(elem);
- }
- else
- src = i;
- }
- bfs(src);
- fill(all(visited),-1);
- dfs(src);
- // vomit(level,1,n+1);
- cin>>src;
- ll elem1;
- while(src--)
- {
- cin>>elem>>elem1;
- if( intime.at(elem1) < intime.at(elem) and outtime.at(elem1) > outtime.at(elem))
- {
- cout<<level.at(elem)-level.at(elem1)-1<<"\n";
- }
- else
- cout<<"-1\n";
- }
- //resetting globals
- rep(i,0,N)
- v[i].clear();
- fill(all(level),-1);
- fill(all(visited),-1);
- timer = 0;
- intime.clear();
- outtime.clear();
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int TESTS=1;
- cin>>TESTS;
- while(TESTS--)
- {
- solve();
- }
- time
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement