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()