Pagini recente »
Istoria paginii runda/2017-11-26-test-5/clasament
|
Istoria paginii utilizator/petrearazvan
|
lmk_vs_9
|
Istoria paginii runda/2024-02-11-clasa-5-concurs03/clasament
|
Cod sursă (job #786464)
Cod sursă (job
#786464)
#include <stdio.h>
#include <stdlib.h>
#define D 0
#define MAXN 100000
#define SEC_SIZE 1000
struct etaj {
int next; // Unde duce burlanul
int jump; // Cati pasi pana iesim din sectiunea etajului
int dest; // Primul etaj din urmatoarea sectiune la care ajungem
};
struct etaj etaje[MAXN+1];
int result(int start){
int tjump, poz;
poz = start;
tjump = 0;
while(poz){
tjump += etaje[poz].jump;
poz = etaje[poz].dest;
}
return tjump;
}
void updateState(int et, int con){
int poz;
etaje[et].next = con;
poz = et;
while((poz-1) % SEC_SIZE != 0){
etaje[poz].jump = etaje[etaje[poz].next].jump+1;
etaje[poz].dest = etaje[etaje[poz].next].dest;
poz++;
}
}
int main()
{
FILE *in, *out;
int n, q, i, j, et, tip, dir;
in = fopen("burlane.in", "r");
fscanf(in, "%d%d", &n, &q);
for(i = 1; i <= n; i++){
fscanf(in, "%d", &et);
etaje[i].next = et;
}
for(i = 1; i <= n; i++){
if((etaje[i].next-1)/SEC_SIZE < (i-1)/SEC_SIZE){
etaje[i].jump = 1;
etaje[i].dest = etaje[i].next;
}else{
etaje[i].jump = etaje[etaje[i].next].jump+1;
etaje[i].dest = etaje[etaje[i].next].dest;
}
}
out = fopen("burlane.out", "w");
for(j = 0; j < q; j++){
fscanf(in, "%d%d", &tip, &et);
switch(tip){
case 1:
fprintf(out, "%d\n", result(et));
break;
case 2:
fscanf(in, "%d", &dir);
updateState(et, dir);
break;
}
}
fclose(out);
fclose(in);
return 0;
}