


'''simple docstring'''







import math
import sys
class    lowercase_	:


    def __init__(	self       ):
          UpperCamelCase__      =							0
          UpperCamelCase__      =							[]
          UpperCamelCase__      =							{}  # To store the pos of node in array


    def   __a				(	self       ):
          return self.cur_size == 0


    def   __a				(	self    ,   a       ):
          UpperCamelCase__      =							self.left(a       )
          UpperCamelCase__      =							self.right(a       )
          if lc < self.cur_size and self.array(a       )[0] < self.array(a       )[0]:
                UpperCamelCase__      =							lc
          else:
                UpperCamelCase__      =							idx
          if rc < self.cur_size and self.array(a       )[0] < self.array(a       )[0]:
                UpperCamelCase__      =							rc
          if smallest != idx:
                self.swap(a    ,   a       )
                self.min_heapify(a       )


    def   __a				(	self    ,   a       ):
          # Inserts a node into the Priority Queue
          UpperCamelCase__      =							self.cur_size
          self.cur_size += 1
          self.array.append((sys.maxsize, tup[1])       )
          self.decrease_key((sys.maxsize, tup[1])    ,   tup[0]       )


    def   __a				(	self       ):
          # Removes and returns the min element at top of priority queue
          UpperCamelCase__      =							self.array[0][1]
          UpperCamelCase__      =							self.array[self.cur_size - 1]
          self.cur_size -= 1
          self.min_heapify(1       )
          del self.pos[min_node]
          return min_node


    def   __a				(	self    ,   a       ):
          # returns the index of left child
          return 2 * i + 1


    def   __a				(	self    ,   a       ):
          # returns the index of right child
          return 2 * i + 2


    def   __a				(	self    ,   a       ):
          # returns the index of parent
          return math.floor(i / 2       )


    def   __a				(	self    ,   a    ,   a       ):
          # swaps array elements at indices i and j
          # update the pos{}
          UpperCamelCase__      =							j
          UpperCamelCase__      =							i
          UpperCamelCase__      =							self.array[i]
          UpperCamelCase__      =							self.array[j]
          UpperCamelCase__      =							temp


    def   __a				(	self    ,   a    ,   a       ):
          UpperCamelCase__      =							self.pos[tup[1]]
          # assuming the new_d is atmost old_d
          UpperCamelCase__      =							(new_d, tup[1])
          while idx > 0 and self.array[self.par(a       )][0] > self.array[idx][0]:
                self.swap(a    ,   self.par(a       )       )
                UpperCamelCase__      =							self.par(a       )

class    lowercase_	:


    def __init__(	self    ,   a       ):
          UpperCamelCase__      =							{}  # To store graph: u -> (v,w)
          UpperCamelCase__      =							num  # Number of nodes in graph
          # To store the distance from source vertex
          UpperCamelCase__      =							[0] * self.num_nodes
          UpperCamelCase__      =							[-1] * self.num_nodes  # To store the path


    def   __a				(	self    ,   a    ,   a    ,   a       ):
          #  Edge going from node u to v and v to u with weight w
          # u (w)-> v, v (w) -> u
          # Check if u already in graph
          if u in self.adjList:
                self.adjList[u].append((v, w)       )
          else:
                UpperCamelCase__      =							[(v, w)]

          # Assuming undirected graph
          if v in self.adjList:
                self.adjList[v].append((u, w)       )
          else:
                UpperCamelCase__      =							[(u, w)]


    def   __a				(	self       ):
          # u -> v(w)
          for u in self.adjList:
                print(a    ,   "->"    ,   " -> ".join(str(f'''{v}({w})'''       ) for v, w in self.adjList[u]       )       )


    def   __a				(	self    ,   a       ):
          # Flush old junk values in par[]
          UpperCamelCase__      =							[-1] * self.num_nodes
          # src is the source node
          UpperCamelCase__      =							0
          UpperCamelCase__      =							PriorityQueue()
          q.insert((0, src)       )  # (dist from src, node)
          for u in self.adjList:
                if u != src:
                      UpperCamelCase__      =							sys.maxsize  # Infinity
                      UpperCamelCase__      =							-1

          while not q.is_empty():
                UpperCamelCase__      =							q.extract_min()  # Returns node with the min dist from source
                # Update the distance of all the neighbours of u and
                # if their prev dist was INFINITY then push them in Q
                for v, w in self.adjList[u]:
                      UpperCamelCase__      =							self.dist[u] + w
                      if self.dist[v] > new_dist:
                            if self.dist[v] == sys.maxsize:
                                  q.insert((new_dist, v)       )
                            else:
                                  q.decrease_key((self.dist[v], v)    ,   a       )
                            UpperCamelCase__      =							new_dist
                            UpperCamelCase__      =							u

        # Show the shortest distances from src
          self.show_distances(a       )


    def   __a				(	self    ,   a       ):
          print(f'''Distance from node: {src}'''       )
          for u in range(self.num_nodes       ):
                print(f'''Node {u} has distance: {self.dist[u]}'''       )


    def   __a				(	self    ,   a    ,   a       ):
          # To show the shortest path from src to dest
          # WARNING: Use it *after* calling dijkstra
          UpperCamelCase__      =							[]
          UpperCamelCase__      =							0
          UpperCamelCase__      =							dest
          # Backtracking from dest to src
          while self.par[temp] != -1:
                path.append(a       )
                if temp != src:
                      for v, w in self.adjList[temp]:
                            if v == self.par[temp]:
                                  cost += w
                                  break
                UpperCamelCase__      =							self.par[temp]
          path.append(a       )
          path.reverse()

          print(f'''----Path to reach {dest} from {src}----'''       )
          for u in path:
                print(f'''{u}'''    ,   end=" "       )
                if u != dest:
                      print("-> "    ,   end=""       )

          print("\nTotal cost of path: "    ,   a       )


if __name__ == "__main__":
  a__    :   List[Any]								=			Graph(9)
  graph.add_edge(0, 1, 4)
  graph.add_edge(0, 7, 8)
  graph.add_edge(1, 2, 8)
  graph.add_edge(1, 7, 1_1)
  graph.add_edge(2, 3, 7)
  graph.add_edge(2, 8, 2)
  graph.add_edge(2, 5, 4)
  graph.add_edge(3, 4, 9)
  graph.add_edge(3, 5, 1_4)
  graph.add_edge(4, 5, 1_0)
  graph.add_edge(5, 6, 2)
  graph.add_edge(6, 7, 1)
  graph.add_edge(6, 8, 6)
  graph.add_edge(7, 8, 7)
  graph.show_graph()
  graph.dijkstra(0)
  graph.show_path(0, 4)

# OUTPUT
# 0 -> 1(4) -> 7(8)
# 1 -> 0(4) -> 2(8) -> 7(11)
# 7 -> 0(8) -> 1(11) -> 6(1) -> 8(7)
# 2 -> 1(8) -> 3(7) -> 8(2) -> 5(4)
# 3 -> 2(7) -> 4(9) -> 5(14)
# 8 -> 2(2) -> 6(6) -> 7(7)
# 5 -> 2(4) -> 3(14) -> 4(10) -> 6(2)
# 4 -> 3(9) -> 5(10)
# 6 -> 5(2) -> 7(1) -> 8(6)
# Distance from node: 0
# Node 0 has distance: 0
# Node 1 has distance: 4
# Node 2 has distance: 12
# Node 3 has distance: 19
# Node 4 has distance: 21
# Node 5 has distance: 11
# Node 6 has distance: 9
# Node 7 has distance: 8
# Node 8 has distance: 14
# ----Path to reach 4 from 0----
# 0 -> 7 -> 6 -> 5 -> 4
# Total cost of path:  21









'''simple docstring'''







def _UpperCamelCase			(	__A ,     __A       )				->						int:


      '''simple docstring'''



      return (input_a, input_a).count(0       ) % 2







def _UpperCamelCase			(	)				->						None:


      '''simple docstring'''



      assert xor_gate(0 ,     0       ) == 0
      assert xor_gate(0 ,     1       ) == 1
      assert xor_gate(1 ,     0       ) == 1
      assert xor_gate(1 ,     1       ) == 0


if __name__ == "__main__":
  print(xor_gate(0, 0))
  print(xor_gate(0, 1))





