1598 - Coada1

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Se consideră C o coadă de numere naturale, iniţial vidă. Se definesc două tipuri de operaţii.

Operaţia 1 : push X, adaugă elementul X în coadă. Dacă X există deja în coadă, se scot toate elementele din coadă, pana la întâlnirea lui, inclusiv X. Exemplu: C: 2 4 5 1 6 Push 5 C: 1 6 5 ( s-au scos 2, 4, 5).

Operaţia 2: query X, cere afişarea poziţiei elementului X în coada C. Dacă elementul nu există în coadă, se afişează -1. Exemplu: C: 2 5 1 3 7 Query 1 Răspuns: 3

Cerința

Dându-se M, reprezentând numărul de operaţii şi cele M operaţii, să se răspundă la operaţiile de tip query.

Date de intrare

Fișierul de intrare coada1in.txt conține:

  • Pe prima linie numărul natural M;
  • Pe următoarele M linii, câte un string şi câte un număr natural, de forma tip_operaţie x, reprezentând tipul operaţiei şi numărul X.

Date de ieșire

Fișierul de ieșire coada1out.txt va conține:

  • Răspunsurile pentru operaţiile de tip query, câte unul pe linie.

Restricții și precizări

  • 1 ≤ M ≤ 50.000
  • 1 ≤ X ≤ 1.000

Exemplul 1:

coada1in.txt
10
push 3
push 6
push 8
push 2
query 6
push 6
query 4
push 6
push 7
query 6
coada1out.txt
Datele de intrare corespund restrictiilor impuse
2
-1
1

Exemplul 2:

coada1in.txt
coada1
coada1out.txt
Datele de intrare nu corespund restrictiilor impuse

Explicație

Înaintea primei întrebări, coada arată asa: 3 6 8 2, deci 6 apare pe poziţia 2. Înaintea celei de-a doua întrebări, coada arată asa: 8 2 6, deci 4 nu apare. Înaintea ultimei întrebări, coada arată asa: 6 7, deci 6 apare pe poziţia 1.


Rezolvare

def validare(m, operatii):  # funcția de validare a datelor de intrare
    if m < 1 or m > 50000:
        raise ValueError
    for operatie in operatii:
        if operatie[0] not in ['push', 'query']:
            raise ValueError
        x = operatie[1]
        if x < 1 or x > 1000:
            raise ValueError
    file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def solve(operatii):  # funcția de rezolvare
    queue = []
    output = []
    for operatie in operatii:
        if operatie[0] == 'push':
            x = operatie[1]
            if x in queue:
                queue = queue[queue.index(x)+1:]
            queue.append(x)
        elif operatie[0] == 'query':
            x = operatie[1]
            if x in queue:
                output.append(queue.index(x) + 1)
            else:
                output.append(-1)
    return output


if __name__ == '__main__':
    file_in = open("coada1in.txt", "r")  # declararea fisierelor
    file_out = open("coada1out.txt", "w")  # fisierul out trebuie declarat cu optiunea "w" (write)

    try:
        M = int(file_in.readline())
        operations = []
        for _ in range(M):
            operation = file_in.readline().split()
            operation[1] = int(operation[1])
            operations.append(operation)

        validare(M, operations)  # apelul funcției de validare
        results = solve(operations)  # apelul funcției de rezolvare

        for result in results:
            file_out.write(str(result) + '\n')

    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")