Pagini recente »
Atașamentele paginii 2018-05-03-clasa-5-tema-39
|
Monitorul de evaluare
|
Istoria paginii utilizator/andreiestenebun
|
Monitorul de evaluare
|
Cod sursă (job #786007)
Cod sursă (job
#786007)
#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;
}