pierwszeDane = input().split(" ") n = int(pierwszeDane[0]) q = int(pierwszeDane[1]) def czyWartoscSieZnajduje(wartosc, tabela): return wartosc in tabela def usunTabeleIPowiazanie(i, tablicaTymczasowychCiagow, tablicaNiewiadomych): tablicaTymczasowychCiagow.pop(i) tablicaNiewiadomych.pop(i) def czyWNiewiadomych(wartosc, tablicaTymczasowychCiagow, tablicaNiewiadomych): for i in range(len(tablicaTymczasowychCiagow)): if czyWartoscSieZnajduje(wartosc, tablicaNiewiadomych[i]): tablicaNiewiadomych[i].remove(wartosc) def czyWCiagach(wartosc, tablicaTymczasowychCiagow, tablicaNiewiadomych): dlugosc = len(tablicaTymczasowychCiagow) doUsuniecia = [] for i in range(dlugosc): if czyWartoscSieZnajduje(wartosc, tablicaTymczasowychCiagow[i]): doUsuniecia.append(i) doUsuniecia.sort(reverse=True) for i in doUsuniecia: usunTabeleIPowiazanie(i, tablicaTymczasowychCiagow, tablicaNiewiadomych) def dodawanieDoListy(wartosc1, wartosc2, tablicaTymczasowychCiagow, tablicaNiewiadomych, tablicaLudzi): dlugosc = len(tablicaTymczasowychCiagow) doUsuniecia = [] czyMain1 = False czyMain2 = False if tablicaLudzi[int(wartosc1)-1]==1: czyMain1=True elif tablicaLudzi[int(wartosc2)-1]==1: czyMain2=True for i in range(dlugosc): if wartosc1 in tablicaTymczasowychCiagow[i] and wartosc2 in tablicaTymczasowychCiagow[i]: doUsuniecia.append(i) elif wartosc1 in tablicaTymczasowychCiagow[i]: if czyMain2: doUsuniecia.append(i) else: tablicaLudzi[int(wartosc2)-1]=1 # tablicaTymczasowychCiagow[i].append(wartosc2) if wartosc2 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc2) elif wartosc2 in tablicaTymczasowychCiagow[i]: if czyMain1: doUsuniecia.append(i) else: # tablicaTymczasowychCiagow[i].append(wartosc1) tablicaLudzi[int(wartosc1)-1]=1 if wartosc1 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc1) elif wartosc1 not in tablicaTymczasowychCiagow[i] and wartosc2 not in tablicaTymczasowychCiagow[i]: if czyMain1: tablicaLudzi[int(wartosc2)-1]=1 # tablicaTymczasowychCiagow[i].append(wartosc2) if wartosc2 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc2) elif czyMain2: tablicaLudzi[int(wartosc1)-1]=1 # tablicaTymczasowychCiagow[i].append(wartosc1) if wartosc1 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc1) else: tablicaTymczasowychCiagow.append(tablicaTymczasowychCiagow[i].copy()) tablicaNiewiadomych.append(tablicaNiewiadomych[i].copy()) tablicaTymczasowychCiagow[i].append(wartosc1) if wartosc1 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc1) if wartosc2 not in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].append(wartosc2) tablicaTymczasowychCiagow[-1].append(wartosc2) if wartosc2 in tablicaNiewiadomych[-1]: tablicaNiewiadomych[-1].remove(wartosc2) if wartosc1 not in tablicaNiewiadomych[-1]: tablicaNiewiadomych[-1].append(wartosc1) doUsuniecia.sort(reverse=True) for i in doUsuniecia: tablicaTymczasowychCiagow.pop(i) tablicaNiewiadomych.pop(i) def commonPart(listy): czescWspolna=[] for i in listy: for j in i: if j not in czescWspolna: czescWspolna.append(j) return czescWspolna def czyWartoscSieZnajduje3(wartosc, tablicaTymczasowychCiagow, tablicaNiewiadomych): doUsuniecia = [] for i in range(len(tablicaTymczasowychCiagow)): if wartosc not in tablicaTymczasowychCiagow[i]: doUsuniecia.append(i) doUsuniecia.sort(reverse=True) for i in doUsuniecia: tablicaTymczasowychCiagow.pop(i) tablicaNiewiadomych.pop(i) def usun_wartość_z_list(lista_list, wartość): for lista in lista_list: while wartość in lista: lista.remove(wartość) def czyPusteNiewiadome(tablicaNiewiadomych): return all(not sublista for sublista in tablicaNiewiadomych) def resetTable(czyPusteNiewiadome, tablicaTymczasowychCiagow, tablicaLudzi, tablicaNiewiadomych): if czyPusteNiewiadome: if tablicaTymczasowychCiagow: for i in tablicaTymczasowychCiagow[0]: tablicaLudzi[int(i)-1]=1 tablicaTymczasowychCiagow=[] tablicaNiewiadomych=[] tablicaLudzi = [0]*n tablicaTymczasowychCiagow = [] tablicaNiewiadomych = [] odp=[] for i in range(q): wydarzenie = input().split(" ") if wydarzenie[0]=="+": if wydarzenie[1] == wydarzenie[2]: tablicaLudzi[int(wydarzenie[1])-1]=1 czyWCiagach(wydarzenie[1], tablicaTymczasowychCiagow, tablicaNiewiadomych) czyWNiewiadomych(wydarzenie[1], tablicaTymczasowychCiagow, tablicaNiewiadomych) else: if tablicaTymczasowychCiagow == []: tablicaTymczasowychCiagow.append([wydarzenie[1]]) tablicaTymczasowychCiagow.append([wydarzenie[2]]) tablicaNiewiadomych.append([wydarzenie[2]]) tablicaNiewiadomych.append([wydarzenie[1]]) else: dodawanieDoListy(wydarzenie[1], wydarzenie[2], tablicaTymczasowychCiagow, tablicaNiewiadomych, tablicaLudzi) resetTable(czyPusteNiewiadome(tablicaNiewiadomych), tablicaTymczasowychCiagow, tablicaLudzi, tablicaNiewiadomych) elif wydarzenie[0]=="-": czyWartoscSieZnajduje3(wydarzenie[1], tablicaTymczasowychCiagow, tablicaNiewiadomych) usun_wartość_z_list(tablicaNiewiadomych, wydarzenie[1]) usun_wartość_z_list(tablicaTymczasowychCiagow, wydarzenie[1]) tablicaLudzi[int(wydarzenie[1])-1] = 0 resetTable(czyPusteNiewiadome(tablicaNiewiadomych), tablicaTymczasowychCiagow, tablicaLudzi, tablicaNiewiadomych) else: if wydarzenie[1] in commonPart(tablicaNiewiadomych): odp.append("?") else: odp.append(tablicaLudzi[int(wydarzenie[1])-1]) # print(commonPart(tablicaNiewiadomych)) # print(tablicaTymczasowychCiagow) # print(tablicaNiewiadomych) # print(tablicaLudzi) odpowiedz="" for i in odp: odpowiedz+=str(i) print(odpowiedz) # print(i,end="")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | pierwszeDane = input().split(" ") n = int(pierwszeDane[0]) q = int(pierwszeDane[1]) def czyWartoscSieZnajduje(wartosc, tabela): return wartosc in tabela def usunTabeleIPowiazanie(i, tablicaTymczasowychCiagow, tablicaNiewiadomych): tablicaTymczasowychCiagow.pop(i) tablicaNiewiadomych.pop(i) def czyWNiewiadomych(wartosc, tablicaTymczasowychCiagow, tablicaNiewiadomych): for i in range(len(tablicaTymczasowychCiagow)): if czyWartoscSieZnajduje(wartosc, tablicaNiewiadomych[i]): tablicaNiewiadomych[i].remove(wartosc) def czyWCiagach(wartosc, tablicaTymczasowychCiagow, tablicaNiewiadomych): dlugosc = len(tablicaTymczasowychCiagow) doUsuniecia = [] for i in range(dlugosc): if czyWartoscSieZnajduje(wartosc, tablicaTymczasowychCiagow[i]): doUsuniecia.append(i) doUsuniecia.sort(reverse=True) for i in doUsuniecia: usunTabeleIPowiazanie(i, tablicaTymczasowychCiagow, tablicaNiewiadomych) def dodawanieDoListy(wartosc1, wartosc2, tablicaTymczasowychCiagow, tablicaNiewiadomych, tablicaLudzi): dlugosc = len(tablicaTymczasowychCiagow) doUsuniecia = [] czyMain1 = False czyMain2 = False if tablicaLudzi[int(wartosc1)-1]==1: czyMain1=True elif tablicaLudzi[int(wartosc2)-1]==1: czyMain2=True for i in range(dlugosc): if wartosc1 in tablicaTymczasowychCiagow[i] and wartosc2 in tablicaTymczasowychCiagow[i]: doUsuniecia.append(i) elif wartosc1 in tablicaTymczasowychCiagow[i]: if czyMain2: doUsuniecia.append(i) else: tablicaLudzi[int(wartosc2)-1]=1 # tablicaTymczasowychCiagow[i].append(wartosc2) if wartosc2 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc2) elif wartosc2 in tablicaTymczasowychCiagow[i]: if czyMain1: doUsuniecia.append(i) else: # tablicaTymczasowychCiagow[i].append(wartosc1) tablicaLudzi[int(wartosc1)-1]=1 if wartosc1 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc1) elif wartosc1 not in tablicaTymczasowychCiagow[i] and wartosc2 not in tablicaTymczasowychCiagow[i]: if czyMain1: tablicaLudzi[int(wartosc2)-1]=1 # tablicaTymczasowychCiagow[i].append(wartosc2) if wartosc2 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc2) elif czyMain2: tablicaLudzi[int(wartosc1)-1]=1 # tablicaTymczasowychCiagow[i].append(wartosc1) if wartosc1 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc1) else: tablicaTymczasowychCiagow.append(tablicaTymczasowychCiagow[i].copy()) tablicaNiewiadomych.append(tablicaNiewiadomych[i].copy()) tablicaTymczasowychCiagow[i].append(wartosc1) if wartosc1 in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].remove(wartosc1) if wartosc2 not in tablicaNiewiadomych[i]: tablicaNiewiadomych[i].append(wartosc2) tablicaTymczasowychCiagow[-1].append(wartosc2) if wartosc2 in tablicaNiewiadomych[-1]: tablicaNiewiadomych[-1].remove(wartosc2) if wartosc1 not in tablicaNiewiadomych[-1]: tablicaNiewiadomych[-1].append(wartosc1) doUsuniecia.sort(reverse=True) for i in doUsuniecia: tablicaTymczasowychCiagow.pop(i) tablicaNiewiadomych.pop(i) def commonPart(listy): czescWspolna=[] for i in listy: for j in i: if j not in czescWspolna: czescWspolna.append(j) return czescWspolna def czyWartoscSieZnajduje3(wartosc, tablicaTymczasowychCiagow, tablicaNiewiadomych): doUsuniecia = [] for i in range(len(tablicaTymczasowychCiagow)): if wartosc not in tablicaTymczasowychCiagow[i]: doUsuniecia.append(i) doUsuniecia.sort(reverse=True) for i in doUsuniecia: tablicaTymczasowychCiagow.pop(i) tablicaNiewiadomych.pop(i) def usun_wartość_z_list(lista_list, wartość): for lista in lista_list: while wartość in lista: lista.remove(wartość) def czyPusteNiewiadome(tablicaNiewiadomych): return all(not sublista for sublista in tablicaNiewiadomych) def resetTable(czyPusteNiewiadome, tablicaTymczasowychCiagow, tablicaLudzi, tablicaNiewiadomych): if czyPusteNiewiadome: if tablicaTymczasowychCiagow: for i in tablicaTymczasowychCiagow[0]: tablicaLudzi[int(i)-1]=1 tablicaTymczasowychCiagow=[] tablicaNiewiadomych=[] tablicaLudzi = [0]*n tablicaTymczasowychCiagow = [] tablicaNiewiadomych = [] odp=[] for i in range(q): wydarzenie = input().split(" ") if wydarzenie[0]=="+": if wydarzenie[1] == wydarzenie[2]: tablicaLudzi[int(wydarzenie[1])-1]=1 czyWCiagach(wydarzenie[1], tablicaTymczasowychCiagow, tablicaNiewiadomych) czyWNiewiadomych(wydarzenie[1], tablicaTymczasowychCiagow, tablicaNiewiadomych) else: if tablicaTymczasowychCiagow == []: tablicaTymczasowychCiagow.append([wydarzenie[1]]) tablicaTymczasowychCiagow.append([wydarzenie[2]]) tablicaNiewiadomych.append([wydarzenie[2]]) tablicaNiewiadomych.append([wydarzenie[1]]) else: dodawanieDoListy(wydarzenie[1], wydarzenie[2], tablicaTymczasowychCiagow, tablicaNiewiadomych, tablicaLudzi) resetTable(czyPusteNiewiadome(tablicaNiewiadomych), tablicaTymczasowychCiagow, tablicaLudzi, tablicaNiewiadomych) elif wydarzenie[0]=="-": czyWartoscSieZnajduje3(wydarzenie[1], tablicaTymczasowychCiagow, tablicaNiewiadomych) usun_wartość_z_list(tablicaNiewiadomych, wydarzenie[1]) usun_wartość_z_list(tablicaTymczasowychCiagow, wydarzenie[1]) tablicaLudzi[int(wydarzenie[1])-1] = 0 resetTable(czyPusteNiewiadome(tablicaNiewiadomych), tablicaTymczasowychCiagow, tablicaLudzi, tablicaNiewiadomych) else: if wydarzenie[1] in commonPart(tablicaNiewiadomych): odp.append("?") else: odp.append(tablicaLudzi[int(wydarzenie[1])-1]) # print(commonPart(tablicaNiewiadomych)) # print(tablicaTymczasowychCiagow) # print(tablicaNiewiadomych) # print(tablicaLudzi) odpowiedz="" for i in odp: odpowiedz+=str(i) print(odpowiedz) # print(i,end="") |