#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <string>
#include <functional>
#include <vector>
#include <numeric>
#include <deque>
#include <bitset>
#include <iostream>
using namespace std;
typedef long long lint;
typedef long double llf;
typedef pair<int,int> pi;
struct disj{
int pa[100005];
void init(int n){
for(int i=0; i<=n; i++) pa[i] = i;
}
int find(int x){
return pa[x] = (pa[x] == x ? x : find(pa[x]));
}
bool uni(int p, int q){
p = find(p), q = find(q);
if(p == q) return 0;
pa[q] = p; return 1;
}
}disj;
struct query{
int t, a, b;
}q[100005];
int n, m, a[100005], kill[100005];
vector<int> graph[100005], rev[100005];
int indeg[100005];
int cyclab[100005], cycidx[100005], cycsz[100005], cycp;
int treein[100005], treeout[100005], root[100005], dep[100005], treep;
void dfs(int x, int r){
treein[x] = ++treep;
root[x] = r;
for(auto &i : rev[x]){
if(cyclab[i]) continue;
dep[i] = dep[x] + 1;
dfs(i, r);
}
treeout[x] = ++treep;
}
void proc_tree(){
for(int i=1; i<=n; i++){
if(rev[i].size() != indeg[i]){
dfs(i, i);
}
}
}
queue<int> que;
void proc_cycle(){
for(int i=1; i<=n; i++){
if(indeg[i] == 0) que.push(i);
}
while(!que.empty()){
int x = que.front();
que.pop();
for(auto &i : graph[x]){
indeg[i]--;
if(indeg[i] == 0) que.push(i);
}
}
for(int i=1; i<=n; i++){
if(indeg[i] && !cyclab[i]){
int p = i;
cycp++;
while(!cyclab[p]){
cyclab[p] = cycp;
cycidx[p] = ++cycsz[cycp];
p = a[p];
}
}
}
}
inline bool inside(int a, int b){
return treein[a] <= treein[b] && treeout[b] <= treeout[a];
}
int solve(int p, int q){
if(cyclab[p] && cyclab[q]){
int dx = cycidx[q] - cycidx[p] + cycsz[cyclab[p]];
dx %= cycsz[cyclab[p]];
return dx;
}
if(cyclab[p] && !cyclab[q]){
return -1;
}
if(!cyclab[p] && cyclab[q]){
return dep[p] + solve(root[p], q);
}
if(inside(q, p)){
return dep[p] - dep[q];
}
return -1;
}
int main(){
cin >> n;
for(int i=1; i<=n; i++){
scanf("%d",&a[i]);
kill[a[i]] = (a[i] == 0);
if(a[i]){
rev[a[i]].push_back(i);
graph[i].push_back(a[i]);
indeg[a[i]]++;
}
}
cin >> m;
for(int i=0; i<m; i++){
scanf("%d",&q[i].t);
if(q[i].t == 1){
scanf("%d",&q[i].a);
kill[q[i].a] = 1;
}
else{
scanf("%d %d",&q[i].a, &q[i].b);
}
}
reverse(q, q+m);
proc_cycle();
proc_tree();
disj.init(n);
for(int i=1; i<=n; i++){
if(!kill[i]) disj.uni(i, a[i]);
}
vector<int> stk;
for(int i=0; i<m; i++){
if(q[i].t == 1){
disj.uni(q[i].a, a[q[i].a]);
}
else{
if(disj.find(q[i].a) != disj.find(q[i].b)) stk.push_back(-1);
else stk.push_back(solve(q[i].a, q[i].b));
}
}
while(!stk.empty()){
printf("%d\n",stk.back());
stk.pop_back();
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
2 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
3 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
4 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
5 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
6 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
7 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
8 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
9 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
10 |
Execution timed out |
1000 ms |
11880 KB |
Program timed out |
11 |
Incorrect |
50 ms |
18908 KB |
Output isn't correct |
12 |
Execution timed out |
1000 ms |
15604 KB |
Program timed out |
13 |
Execution timed out |
1000 ms |
17032 KB |
Program timed out |
14 |
Execution timed out |
1000 ms |
15120 KB |
Program timed out |
15 |
Execution timed out |
1000 ms |
15904 KB |
Program timed out |
16 |
Execution timed out |
1000 ms |
15752 KB |
Program timed out |
17 |
Execution timed out |
1000 ms |
18472 KB |
Program timed out |
18 |
Execution timed out |
1000 ms |
18472 KB |
Program timed out |
19 |
Execution timed out |
1000 ms |
18476 KB |
Program timed out |
20 |
Incorrect |
80 ms |
18908 KB |
Output isn't correct |