Problem hidden
This problem was hidden by Editorial Board member probably because it has incorrect language version or invalid test data, or description of the problem is not clear.

Problem hidden

WI_KLAST - Przydział klastrów

no tags 

Jednym z angielskich słów, z którym komputerowa polszczyzna nie dała sobie rady, jest termin cluster. Próbowano wielokrotnie zastąpić tego Anglosasa jakimś zgrabnym polskim odpowiednikiem, ale się nie udało – jedyny widoczny efekt to taki, że spolszczono pisownię tego słowa, dzięki czemu możemy w różnych miejscach natknąć się na niezbyt piękne i zupełnie niepolskie słowo klaster.

Klaster pojawia się w wielu różnych dziedzinach informatyki (i nie tylko informatyki), my jednak zajmiemy się dzisiaj tylko jednym jego obliczem, związanym niepodzielnie ze sposobem, w jaki system operacyjne zarządza przestrzenią dyskową.

Pliki rozmieszczone na dysku rzadko kiedy zajmują na nośniku dokładnie tyle miejsca, ile wynosi ich rozmiar. Zazwyczaj zajmują go znacznie więcej, a dzieje się tak dlatego, że system operacyjny przydziela nośnik plikowi nie pojedynczymi bajtami, a tylko i wyłącznie całymi klastrami (które w tym zastosowaniu czasem nazywa się jednostkami przydziału). Jeśli np. założymy na dysku plik, w którym zapiszemy dokładnie jeden bajt, to i tak system operacyjny przydzieli temu plikowi cały klaster. Wynika z tego niezbicie, że klaster powinien być jak najmniejszy, by marnotrawstwo przestrzeni dyskowej było jak najmniejsze. Niestety, mały klaster w konsekwencji zaowocuje wielką liczbą klastrów, a przecież informacje o przydziałach system operacyjny musi efektywnie pamiętać i przetwarzać. Z tego powodu rozmiar klastra jest zwykle kompromisem pomiędzy wydajnością systemu operacyjnego i akceptowalną wielkością dyskowych nieużytków.

Twoim zadaniem będzie napisanie fragmentu kodu, który posłuży systemowi operacyjnemu WIZUT 2009 do poprawnego zarządzania przestrzenią dyskową.

Zakładamy, że całkowity dostępny rozmiar dysku wynosi n klastrów, a sam klaster ma rozmiar r bajtów. W stanie początkowym na dysku nie istnieje żaden plik, więc wszystkie klastry są dostępne. System WIZUT 2009 umożliwia wykonanie na dysku następujących operacji:

  • CREATE – zakłada nowy plik o podanej nazwie i zerowym rozmiarze

  • WRITE – dopisuje do pliku o podanej nazwie wskazaną liczbę bajtów

  • TRUNCATE – usuwa z pliku o podanej nazwie wskazaną liczbę bajtów

  • DELETE – kasuje plik o podanej nazwie

Jeśli wykonanie pewnej operacji jest niemożliwe (z dowolnego powodu), system WIZUT 2009 ignoruje ją kompletnie.

Polecenie: napisz program, który symuluje działanie systemu operacyjnego WIZUT 2009, śledząc efekty wykonania podanego na standardowym wejściu ciągu poleceń

Dane wejściowe: nieznana z góry liczba wierszy tekstu zawierających kolejno:

  • wiersz 1: liczba klastrów dostępnych na dysku (całkowite n: n >=1 i n < 100000)

  • wiersz 2: rozmiar klastra na dysku w bajtach ( całkowite r: n >=1 i n < 1000)

  • w kolejnych wierszach: polecenia dla systemu - w każdym wierszu jedno z poniższych:

    • polecenie utworzenia pliku postaci:
      CREATE nazwa_pliku
      gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków
      powoduje utworzenie pliku o podanej nazwie i zerowej długości;
      jeśli plik o takiej nazwie już istnieje, polecenie jest ignorowane.
       

  •  
    • polecenie dopisania do pliku wskazanej liczby bajtów:  WRITE nazwa_pliku liczba_bajtów
      gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków;
      liczba_bajtów jest liczbą całkowitą z przedziału od 1 do 10000;
      powoduje, że plik o nazwie nazwa_pliku powiększa swój rozmiar o liczbę_bajtów, czemu może towarzyszyć przydzielenie plikowi nowych klastrów;
      jeśli plik o podanej nazwie nie istnieje, polecenie jest ignorowane;
      jeśli na dysku nie ma miejsca na dopisanie wskazanej liczby bajtów, polecenie jest ignorowane;
    •  polecenie usunięcia z pliku wskazanej liczby bajtów:
      TRUNCATE nazwa_pliku liczba_bajtów
       gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków;
      liczba_bajtów jest liczbą całkowitą z przedziału od 1 do 10000;
      powoduje, że plik o nazwie nazwa_pliku zmniejsza swój rozmiar o liczbę_bajtów, czemu może towarzyszyć zwolnienie przez plik pewnej liczby klastrów;
      jeśli plik o podanej nazwie nie istnieje, polecenie jest ignorowane;
      jeśli plik ma rozmiar mniejszy niż wskazano liczba bajtów, polecenie jest ignorowane.
    • polecenie skasowania pliku postaci:
      DELETE nazwa_pliku
      gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków
      powoduje usunięcie pliku o podanej nazwie i zwolnienie zajmowanych przez niego klastrów;
      jeśli plik o takiej nazwie nie istnieje, polecenie jest ignorowane.

Dane wyjściowe:

  • jeden wiersz, zawierający jedną daną całkowitą, będącą liczbą wolnych klastrów na dysku po wykonaniu wszystkich poleceń ze standardowego wejścia.

Przykład:

Wejście:

4

512

CREATE PLIK1

CREATE PLIK2

CREATE PLIK3

CREATE PLIK4

WRITE PLIK1 1

WRITE PLIK1 511

WRITE PLIK2 1024

WRITE PLIK3 100

WRITE PLIK4 1024

TRUNCATE PLIK4 1024

DELETE PLIK3

Wyjście:

1

 


Added by:Sławomir Wernikowski
Date:2009-09-22
Time limit:2s
Source limit:5000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:C CSHARP CPP C99 JAVA PAS-GPC PAS-FPC
Resource:Konkurs o nagrodę Dziekana WI ZUT w Szczecinie (2009)