Cod sursă (job #786007)

Utilizator avatar avram.popa Avram-Popa avram.popa IP ascuns
Problemă Burlane Compilator c-32 | 1,84 kb
Rundă Arhiva de probleme Status evaluat
Dată 12 sept. 2024 20:29:56 Scor 100
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXSQRT 317
#define MAXN 1000172
typedef struct {
    int jumps,next,dest;
//numarul de sarituri pana ies din bucket-ul curent
//prima pozitie in care ies din bucket-ul curent
//destinatia burlanului
} burlan;
FILE *fin,*fout;
burlan burlane[MAXN+1];
int bucket_size,q,n,no_buckets;
void update_range(int poz,int start) {
    int end=start+bucket_size,i,j;
    if(poz==0) {
        poz=1;
    }
    for(i=poz; i<end; i++) {
        j=burlane[i].dest;
        if (j<start) {
            burlane[i].jumps=1;
            burlane[i].next=j;
        } else {
            burlane[i].jumps=1+burlane[j].jumps;
            burlane[i].next=burlane[j].next;
        }
    }
}
void query(int pos) {
    int no_jumps=0;
    while (pos) {
        no_jumps+=burlane[pos].jumps;
        pos=burlane[pos].next;
    }
    fprintf(fout, "%d\n",no_jumps);
}
void operations() {
    int operation,poz,i,destination,start;
    for(i=0; i<q; i++) {
        fscanf(fin,"%d%d",&operation,&poz);
        if(operation==1) {
            query(poz);
        } else {
            fscanf(fin,"%d",&destination);
            burlane[poz].dest=destination;
            start=(poz/bucket_size)*bucket_size;
            update_range(poz,start);
        }
    }
}
void read_input() {
    int i;
    fscanf(fin,"%d%d",&n,&q);
    for(i=1; i<=n; i++) {
        fscanf(fin,"%d",&burlane[i].dest);
    }
}
void init_buckets() {
    int i;
    bucket_size=sqrt(n+1);
    no_buckets=n/bucket_size+1;
    for(i=0; i<no_buckets; i++) {
        update_range(i*bucket_size,i*bucket_size);
    }
}
int main() {
    fin=fopen("burlane.in","r");
    read_input();
    init_buckets();
    fout=fopen("burlane.out","w");
    operations();
    fclose(fin);
    fclose(fout);
    return 0;
}