Pagini recente »
2021-03-26-clasa-6-tema-27
|
Istoria paginii runda/concurs_9-10_2024_1
|
2024-03-26-clasa-6-tema-25
|
2023-12-19-clasa-6-tema-14
|
Cod sursă (job #786311)
Cod sursă (job
#786311)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 100000
int v[MAXN+2];
int pasi[MAXN+2];
int iesire[MAXN+2];
int grupa[MAXN+2];
int main()
{
FILE *fin; FILE *fout;
int n, q, rad, i, c, x, y, j, gx, skibidi;//skibidi=ans
fin=fopen("burlane.in", "r");
fout=fopen("burlane.out", "w");
fscanf(fin, "%d%d", &n, &q);
rad = sqrt(n);
for(i = 1; i <= n; i++){
fscanf(fin, "%d", &v[i]);
grupa[i] = i / rad;
if(v[i] / rad != i / rad){
pasi[i] = 1;
iesire[i] = v[i];
}
else{
pasi[i] = pasi[v[i]] + 1;
iesire[i] = iesire[v[i]];
} }
for(i = 1; i <= q; i++){
fscanf(fin, "%d%d", &c, &x);
if(c == 1){
skibidi = 0;
while(x !=0 ){
skibidi += pasi[x];
x = iesire[x];
}
fprintf(fout, "%d\n", skibidi);
}
else{
fscanf(fin, "%d", &y);
v[x] = y;
if(grupa[x] == grupa[y]){
iesire[x] = iesire[y];
pasi[x] = pasi[y] + 1;
}
else{
iesire[x] = y;
pasi[x] = 1;
}
gx = grupa[x];
x++;
while(grupa[x] == gx){
if(grupa[x] == grupa[v[x]]){
pasi[x] = pasi[v[x]] + 1;
iesire[x] = iesire[v[x]];
}
x++;
}
}
}
fclose(fin);
fclose(fout);
return 0;
}