Cod sursă (job #786311)

Utilizator avatar Paunescu_Stefan_Vlad Paunescu Stefan Vlad Paunescu_Stefan_Vlad IP ascuns
Problemă Burlane Compilator c-32 | 1,61 kb
Rundă Arhiva de probleme Status evaluat
Dată 15 sept. 2024 12:36:53 Scor 100
#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;
}