import bisect def main(): import sys input = sys.stdin.read().split() ptr = 0 n = int(input[ptr]) ptr += 1 m_intervals = dict() max_m = -1 for _ in range(n): l = int(input[ptr]) r = int(input[ptr+1]) a = int(input[ptr+2]) ptr +=3 if a < 0: continue # Mex is non-negative, so negative a can be ignored if a not in m_intervals: m_intervals[a] = [] m_intervals[a].append((l, r)) # Merge intervals for each m for m in m_intervals: intervals = m_intervals[m] if not intervals: continue intervals.sort() merged = [] current_start, current_end = intervals[0] for interval in intervals[1:]: if interval[0] <= current_end + 1: # Merge the intervals current_end = max(current_end, interval[1]) else: merged.append((current_start, current_end)) current_start, current_end = interval merged.append((current_start, current_end)) m_intervals[m] = merged sorted_ms = sorted(m_intervals.keys()) if sorted_ms: max_m = sorted_ms[-1] else: max_m = -1 q = int(input[ptr]) ptr +=1 x_list = list(map(int, input[ptr:ptr+q])) ptr +=q for x in x_list: m = 0 while True: if m not in m_intervals: print(m) break intervals = m_intervals[m] # Binary search to find if x is covered # Find the rightmost interval where start <= x idx = bisect.bisect_right(intervals, (x, float('inf'))) -1 if idx >=0: l, r = intervals[idx] if l <= x <= r: # x is covered, check next m m +=1 if m > max_m: print(max_m +1) break continue # x is not covered in m's intervals print(m) break if __name__ == "__main__": main()