Cod sursă (job #786478)

Utilizator avatar MIHNEA_PURCAREA Nerdvana 8 MIHNEA PURCAREA MIHNEA_PURCAREA IP ascuns
Problemă Burlane Compilator c-32 | 1,69 kb
Rundă Arhiva de probleme Status evaluat
Dată 15 sept. 2024 18:12:50 Scor 100
#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;
}