Welfare State (Codeforces 1199D)
Tags: Implement, data structures

There is a country with $$$n$$$ citizens. The $$$i$$$-th of them initially has $$$a_{i}$$$ money. The government strictly controls the wealth of its citizens. Whenever a citizen makes a purchase or earns some money, they must send a receipt to the social services mentioning the amount of money they currently have.Sometimes the government makes payouts to the poor: all citizens who have strictly less money than $$$x$$$ are paid accordingly so that after the payout they have exactly $$$x$$$ money. In this case the citizens don't send a receipt.You know the initial wealth of every citizen and the log of all events: receipts and payouts. Restore the amount of money each citizen has after all events.

Input: The first line contains a single integer $$$n$$$ ($$$1 \le n \le 2 \cdot 10^{5}$$$) — the numer of citizens.The next line contains $$$n$$$ integers $$$a_1$$$, $$$a_2$$$, ..., $$$a_n$$$ ($$$0 \le a_{i} \le 10^{9}$$$) — the initial balances of citizens.The next line contains a single integer $$$q$$$ ($$$1 \le q \le 2 \cdot 10^{5}$$$) — the number of events.Each of the next $$$q$$$ lines contains a single event. The events are given in chronological order.Each event is described as either 1 p x ($$$1 \le p \le n$$$, $$$0 \le x \le 10^{9}$$$), or 2 x ($$$0 \le x \le 10^{9}$$$). In the first case we have a receipt that the balance of the $$$p$$$-th person becomes equal to $$$x$$$. In the second case we have a payoff with parameter $$$x$$$.

Output: Print $$$n$$$ integers — the balances of all citizens after all events.

Note: In the first example the balances change as follows: 1 2 3 4 $$$\rightarrow$$$ 3 3 3 4 $$$\rightarrow$$$ 3 2 3 4 $$$\rightarrow$$$ 3 2 3 4In the second example the balances change as follows: 3 50 2 1 10 $$$\rightarrow$$$ 3 0 2 1 10 $$$\rightarrow$$$ 8 8 8 8 10 $$$\rightarrow$$$ 8 8 20 8 10

Sample Inputs:
4
1 2 3 4
3
2 3
1 2 2
2 1

5
3 50 2 1 10
3
1 2 0
2 8
1 3 20

Sample Outputs:
3 2 3 4

8 8 20 8 10

Solution (Python):
n = int(input())
money = list(map(int, input().split()))
q = int(input())
tranzactions = list((list(map(int, input().split())) for _ in range(q)))
result = [-1] * n
temp = -1
for i in range(q - 1, -1, -1):
    if tranzactions[i][0] == 1:
        if result[tranzactions[i][1] - 1] == -1:
            result[tranzactions[i][1] - 1] = max(tranzactions[i][2], temp)
    else:
        temp = max(tranzactions[i][1], temp)
for i in range(n):
    if result[i] == -1:
        result[i] = max(temp, money[i])
print(' '.join(map(str, result)))

Solution (Python):
n = int(input())
money = list(map(int, input().split()))
q = int(input())
tranzactions = list((list(map(int, input().split())) for _ in range(q)))
result = [-1] * n
temp = -1
for i in range(q - 1, -1, -1):
    if tranzactions[i][0] == 1:
        if result[tranzactions[i][1] - 1] == -1:
            result[tranzactions[i][1] - 1] = max(tranzactions[i][2], temp)
    else:
        temp = max(tranzactions[i][1], temp)
for i in range(n):
    if result[i] == -1:
        result[i] = max(temp, money[i])
print(' '.join(map(str, result)))

Solution (Python):
INF = 10 ** 12
n = int(input())
a = [int(item) for item in input().split()]
min_recipt = [INF] * n
q = int(input())
max_payoff = 0
query = []
for i in range(q):
    query.append([int(item) for item in input().split()])
ans = [-1] * n
for que in query[::-1]:
    if que[0] == 1:
        if ans[que[1] - 1] != -1:
            continue
        ans[que[1] - 1] = max(max_payoff, que[2])
    elif que[0] == 2:
        max_payoff = max(max_payoff, que[1])
for (i, (val, item)) in enumerate(zip(a, ans)):
    if item != -1:
        continue
    ans[i] = max(max_payoff, val)
print(' '.join([str(item) for item in ans]))