Pagini recente »
Monitorul de evaluare
|
Profil florinflorin
|
Istoria paginii utilizator/irina_nacu
|
Atașamentele paginii Tema 12 clasele 9-10 2014/15
|
Cod sursă (job #786478)
Cod sursă (job
#786478)
#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;
do{
if((poz-1)/SEC_SIZE > (etaje[poz].next-1)/SEC_SIZE){
etaje[poz].jump = 1;
etaje[poz].dest = etaje[poz].next;
}else{
etaje[poz].jump = etaje[etaje[poz].next].jump+1;
etaje[poz].dest = etaje[etaje[poz].next].dest;
}
poz++;
}while((poz-1) % SEC_SIZE != 0);
}
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;
}