#!/usr/bin/python3 # -*- coding: utf8 -*- N, M = map(int, input().split()) znak = ["?"] * N # pro každé políčko jeho znak nebo ?, pokud ještě není určen naslednici = [[] for i in range(N)] # pro každé políčko seznam políček, do kterých se má jeho hodnota nakopírovat pozice = 0 # pozice prvního znaku aktuálního bloku for i in range(M): typ, delka, data = input().split() delka = int(delka) # velikost bloku if typ == 'D': # datový blok, v `data` je obsah for j in range(delka): znak[pozice + j] = data[j] else: # referenční blok, `data` je adresa adresa = int(data) for j in range(delka): # do `pozice + j` chceme nakopírovat hodnotu z `adresa + j` naslednici[adresa + j].append(pozice + j) pozice += delka def rozsir(start_v): """Rozšíří znak z políčka start_v všude, kam to jde.""" assert znak[start_v] != "?", "Políčko, ze kterého šíříme, není určeno." # Následuje stromové DFS (které nekontroluje, zda jsme vrchol už # nenavštívili). Fungovalo by třeba i klasické DFS / BFS / rekurzivní # volání se. zasobnik = [start_v] while zasobnik: v = zasobnik.pop() for s in naslednici[v]: znak[s] = znak[v] zasobnik.append(s) # seznam políček, jejichž hodnotu už známe urcene = [v for v in range(N) if znak[v] != "?"] # z každého určeného políčka hodnotu rozkopírujeme všude, kde to jde for i in urcene: rozsir(i) # kontrola, že jsme určili všechna políčka (pokud ne, pak to nejde) for i in range(N): if znak[i] == "?": print("NEJDE") break print("".join(znak))