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
dane = input().split()
n = int(dane[0])
q = int(dane[1])
mieszkancy = [0]*n
result = ""
wejscia = []
stan = []

for i in range(q):
    wejscia.append(input().split())

dane = []
for i in wejscia:
    if i[0] == "+":
        dane.append(sorted([i[1], i[2]]))
    if i[0] == "-":
        dane.append([-1, i[1]])
    if i[0] == "?":
        dane.append(["sprawdz", i[1]])

import numpy as np
mieszkancy = np.array([[0]*n]*n, dtype=float)
macierz_faktow = np.array([[0]*n]*n)
usuniete = dict()
mieszkancy = mieszkancy.astype(int)
miasto = [0]*n
pole = []
fakty = []
def sprawdz():
    global mieszkancy
    # wizualizacja
    # print("potencjalna macierz")
    # print(mieszkancy)
    # print("trojkat prawdopodobienstwa")
    # warunkiem działania trójkata jest pełna podstawa (ciągła) oraz wierzchołek 
    trojkat = []
    for slice in range(n):
        linia = []
        for i in range(slice + 1):
            j = n - slice + i - 1
            if j < n:
                if i == 0:
                    k = j-i
                else:
                    k = 0
                # print(" " * k + str(mieszkancy[i][j]), end=' ')
                # print(mieszkancy[i][j], end=' ')
                linia.append(mieszkancy[i][j])
        trojkat.append(linia)
        # print()
    # print(f"Usuniete {usuniete}")

    h = len(trojkat)
    def szukaj(i, j, leng = 0):
        global pole
        if j < i:
            if trojkat[i][j] != 0:
                leng += 1
                szukaj(i,j+1, leng)
            elif leng < j + 1 and leng < i + 1:
                if trojkat[i-leng+1][j-leng] != 0:
                    if leng > 1:
                        for s in range(leng):
                            for z in range(s+1):
                                if trojkat[i-leng+1+s][z] != 0:
                                    pole.append((i-leng+1+s,z+1))
        elif leng < j + 1 and leng < i + 1:
            if trojkat[i-leng+1][j-leng] != 0:
                if leng > 1:
                    for s in range(leng):
                        for z in range(s+1):
                            if trojkat[i-leng+1+s][z] != 0:
                                pole.append((i-leng+1+s,z+1))

    for i in range(h):
        for j in range(len(trojkat[i])):
            if trojkat[i][j] != 0:
                if j < i:
                    szukaj(i,j)
    
    fakty.append(pole)
    if len(pole)>0:
        wszystkie_inty = set([element for para in pole for element in para])
        for i in wszystkie_inty:
            miasto[i-1] = 1
    # print(fakty)
iterator = 0
result = ""
for losowanie in dane:
    pole = []
    sprawdz()
    if losowanie[0] == "sprawdz":
        # print(iterator, losowanie[1])
        # print(f"Sprawdzam {losowanie[1]}")
        if miasto[int(losowanie[1])-1] == 1:
            result += "1"
        else:
            suma = np.sum(mieszkancy[:, int(losowanie[1])-1])+ np.sum(mieszkancy[int(losowanie[1])-1, :])
            if suma > 0:
                result += "?"
            else:
                result += "0"
        iterator += 1
        continue
    else:
        iterator += 1
    losowanie = [int(x) for x in losowanie]
    if losowanie[0] == -1:
        for i in range(n):
            if mieszkancy[losowanie[1]-1][i] != 0:
                mieszkancy[losowanie[1]-1][i] /= 2
                if usuniete.get(losowanie[1]):
                    usuniete[losowanie[1]].append(i+1)
                else:
                    usuniete[losowanie[1]] = [i+1]
            if mieszkancy[i][losowanie[1]-1] != 0:
                mieszkancy[i][losowanie[1]-1] /= 2
                if usuniete.get(losowanie[1]):
                    usuniete[losowanie[1]] = [i+1]
                else:
                    usuniete[losowanie[1]] = [i+1]
        miasto[losowanie[1]-1] = 0
    else:
        if usuniete.get(losowanie[0]):
            if losowanie[1] in usuniete[losowanie[0]]:
                fors = usuniete[losowanie[0]].copy()
                for usuniety in fors:
                    if 0< mieszkancy[losowanie[0]-1][usuniety-1] < 1:
                        mieszkancy[losowanie[0]-1][usuniety-1] = 1
                    usuniete[losowanie[0]].remove(usuniety)
        if usuniete.get(losowanie[1]):
            if losowanie[0] in usuniete[losowanie[1]]:
                fors = usuniete[losowanie[1]].copy()
                for usuniety in fors:
                    if 0< mieszkancy[losowanie[1]-1][usuniety-1] < 1:
                        mieszkancy[losowanie[1]-1][usuniety-1] = 1
                    usuniete[losowanie[1]].remove(usuniety)
        mieszkancy[losowanie[0]-1][losowanie[1]-1] += 1
        
    if losowanie[0] == losowanie[1]:
        mieszkancy[losowanie[0]-1][losowanie[1]-1] = 2
        miasto[losowanie[1]-1] = 1
print(result)