class T:
    def __init__(self, m):
        self.N = 1 << m                    # 2 puissance m
        self.s = [0] * 2 * self.N          # 0 = gris ou pas de couleur

    def paint(self, a, b, c):
        self._paint((a,b), c, 1, (0, self.N - 1))  # initier à la racine

    def _paint(self, color_range, color, node, node_range):
        if disjoint(color_range, node_range):
            return                         # rien à faire
        elif included(node_range, color_range):
            self.s[node] = color           # colorier juste ce nœud
        else:
            left_son = 2 * node
            right_son = 2 * node + 1
            if self.s[node] != 0:          # propager couleur vers le bas
                self.s[left_son] = self.s[node]
                self.s[right_son] = self.s[node]
            left_range, right_range = split(node_range)
            self._paint(color_range, color, left_son, left_range)
            self._paint(color_range, color, right_son, right_range)

    def color(self, a):
        node = 1                          # démarrer à la racine
        node_range = (0, self.N - 1)
        while (node_range != (a, a)):     # feuille ?
            if self.s[node] != 0:
                return self.s[node]       # première couleur rencontrée
            left_range, right_range = split(node_range)
            if contains(left_range, a):   # descendre dans l'arbre
                node = 2 * node
                node_range = left_range
            else:
                node = 2 * node + 1
                node_range = right_range
        return self.s[node]

# petites fonctions sur des intervalles

def disjoint(A, B):
    return max(A) < min(B) or max(B) < min(A)

def included(A, B):
    return min(B) <= min(A) and max(A) <= max(B)

def split(A):
    lo, hi = A
    mid = (lo + hi + 1) // 2
    return (lo, mid - 1), (mid, hi)

def contains(A, x):
    return min(A) <= x and x <= max(A)