Загрузка данных


import sys

def solve():
    # Считываем все данные целиком. Это сильно ускоряет ввод (sys.stdin.read)
    # по сравнению с обычным input() в цикле.
    input_data = sys.stdin.read().split()
    if not input_data:
        return

    n = int(input_data[0])
    cards = input_data[1:n+1]
    q = int(input_data[n+1])
    queries = input_data[n+2:]
    
    # Чтобы быстро обращаться к картам, пронумеруем их от 0 до 8
    card_to_idx = {
        'a1': 0, 'a2': 1, 'a3': 2,
        'b1': 3, 'b2': 4, 'b3': 5,
        'c1': 6, 'c2': 7, 'c3': 8
    }
    
    # Здесь храним индекс ближайшей карты каждого вида справа от текущей позиции
    # float('inf') означает, что карта пока не встречалась
    last_pos = [float('inf')] * 9
    
    # max_req[i] хранит минимальный правый индекс, чтобы собрать все 9 карт
    # начиная с индекса i. Делаем массив размером n + 2 для удобства 1-индексации.
    max_req = [float('inf')] * (n + 2)
    
    # Идем по массиву карт с конца (справа налево)
    for i in range(n, 0, -1):
        card = cards[i - 1]
        idx = card_to_idx[card]
        
        # Обновляем индекс текущей карты
        last_pos[idx] = i
        
        # Чтобы собрать пасьянс с позиции i, нужно дойти до самой "дальней" из 9 карт.
        # Если какой-то карты вообще нет правее i, max() вернет бесконечность.
        max_req[i] = max(last_pos)
        
    out = []
    
    # Быстро отвечаем на запросы за О(1)
    for j in range(q):
        l = int(queries[j * 2])
        r = int(queries[j * 2 + 1])
        
        required_r = max_req[l]
        
        if required_r <= r:
            # Если необходимая правая граница влезает в заданный отрезок
            # Количество ходов - это длина отрезка от L до required_r
            out.append(str(required_r - l + 1))
        else:
            out.append("-1")
            
    # Быстрый вывод всех ответов за один раз
    print('\n'.join(out))

if __name__ == '__main__':
    solve()