1164 - inception

De la Universitas MediaWiki

Enunt

În seara dinaintea probei de concurs, Cobby a avut un vis demn de un Oscar, cu mai multe evenimente. Se făcea că lumea era reprezentată ca o matrice pătratică de latură N, cu liniile și coloanele numerotate de la 1 la N, în care fiecare element era inițial vid. Privind în jur, a realizat că atunci când visează un element al matricei, situat la intersecția liniei i cu coloana j, interiorul acestuia se împarte în N linii și N coloane, ca o nouă matrice. Apoi, dacă visează la un element din matricea nou formată sau din cea inițială, se întâmplă la fel.

Pentru a nu se rătăci, eroul nopții a decis să atribuie un indice fiecărei matrice formată începând cu cea inițială căreia i-a asociat indicele 1. Matricele care se creează primesc indici numere naturale consecutive (2, 3, …), în ordinea în care se obţin. Astfel, fiecare element din visul lui Cobby este definit de 3 numere: id – indicele atribuit matricei din care face parte, i şi j – indicii liniei şi coloanei pe care se află elementul.

Cobby realizează că, oricât ar încerca, nu poate visa un element decât o singură dată. Pentru a face visul şi mai interesant, el reţine pentru fiecare matrice un număr natural denumit “coeficient de importanţă”, iniţial 0 pentru fiecare matrice din vis. Din când în când, eroul nostru alege una dintre matrice şi adaugă o valoare VAL la coeficientul de importanță al ultimelor NR matrice din care s-a obținut aceasta, inclusiv ea.

Cerința

După ce au loc toate evenimentele din vis, Cobby vrea să ştie valoarea finală a coeficientului de importanţă pentru un șir de K matrice date prin indicii lor. Deoarece el se grăbeşte să participe la Concursul Naţional Urmaşii lui Moisil, îţi revine ţie misiunea de a găsi răspunsul pentru fiecare matrice.

Date de intrare

Pe prima linie a fişierului inception.in se află valorile N – numărul de linii şi coloane din fiecare matrice, Q – numărul de evenimente care au loc în visul lui Cobby, K – numărul de matrice pentru care Cobby vrea să ştie coeficientul de importanţă. Următoarele Q linii respectă unul dintre formatele:

  • 1 id i j – Cobby visează elementul de pe linia i şi coloana j din matricea cu indicele id
  • 2 id NR VAL – Cobby adaugă valoarea VAL la coeficienţii de importanţă a NR matrice începând cu matricea cu indicele id.

Pe linia Q+2 se află K valori id1 id2 ... idK, separate prin câte un spaţiu, ce reprezintă indicii matrice lor pentru care trebuie afişată valoarea finală a coeficientului de importanţă. Evenimentele se petrec în ordinea în care sunt date în fişier.

Date de ieșire

Pe prima linie a fişierului inception.out se află K valori r1 r2 ... rK, separate prin câte un spaţiu, unde ri reprezintă coeficientul final al matricei cu id-ul id i, i din [1,K].

Restricții și precizări

  • 1 ≤ N ≤ 500000
  • 1≤ Q ≤ 300000
  • 1≤VAL≤1000
  • 1 ≤ K, NR, id ≤ numărul total de operații de tipul 1.
  • În ambele tipuri de evenimente valoare id corespunde unei matrice

formate anterior.

  • Se garantează că există cel puţin NR matrice care pot fi modificate pentru operaţia de tipul 2.
  • Pentru 20% dintre teste orice matrice va conţine cel mult un element visat.

Exemplul 1

inceptionin.txt
3 6 3
1 1 2 3
1 2 3 3
2 3 3 5
1 1 3 1
1 2 3 1
2 5 2 3
2 1 4
inceptionout.txt
Datele introduse corespund restrictiilor impuse.
8 5 0

Exemplul 2

inceptionin.txt
0 484 0
-2 -3 -54
-86 9 2
-83 -3 5
-23 -24 0
-1 -2 -6
inceptionout.txt
Datele de intrare nu corespund restrictiilor impuse.

= Rezolvare

def visul_lui_cobby(N, evenimente):
    coeficient_importanta = [0]  # Lista coeficienților de importanță pentru fiecare matrice
    matrice_curenta = [[0] * N for _ in range(N)]  # Matricea curentă

    for eveniment in evenimente:
        id, i, j, VAL, NR = eveniment

        # Creăm o nouă matrice
        matrice_noua = [[0] * N for _ in range(N)]

        # Copiem elementele din matricea curentă în matricea nouă
        for x in range(N):
            for y in range(N):
                matrice_noua[x][y] = matrice_curenta[x][y]

        # Actualizăm coeficientul de importanță pentru matricea curentă
        coeficient_importanta[-1] += VAL

        # Actualizăm ultimele NR matrice cu coeficientul de importanță
        for k in range(NR):
            coeficient_importanta[-k - 2] += VAL

        # Adaugăm coeficientul de importanță pentru matricea nouă
        coeficient_importanta.append(0)

        # Actualizăm elementul din matricea curentă și obținem matricea nouă
        matrice_noua[i - 1][j - 1] = id
        matrice_curenta = matrice_noua

    return coeficient_importanta[1:]  # Excludem primul element din lista de coeficienți

print(rezultat)