Train and Queries (Codeforces 1702C)
Tags: Greedy, data structures

Along the railroad there are stations indexed from $$$1$$$ to $$$10^9$$$. An express train always travels along a route consisting of $$$n$$$ stations with indices $$$u_1, u_2, \dots, u_n$$$, where ($$$1 \le u_i \le 10^9$$$). The train travels along the route from left to right. It starts at station $$$u_1$$$, then stops at station $$$u_2$$$, then at $$$u_3$$$, and so on. Station $$$u_n$$$ — the terminus.It is possible that the train will visit the same station more than once. That is, there may be duplicates among the values $$$u_1, u_2, \dots, u_n$$$.You are given $$$k$$$ queries, each containing two different integers $$$a_j$$$ and $$$b_j$$$ ($$$1 \le a_j, b_j \le 10^9$$$). For each query, determine whether it is possible to travel by train from the station with index $$$a_j$$$ to the station with index $$$b_j$$$.For example, let the train route consist of $$$6$$$ of stations with indices [$$$3, 7, 1, 5, 1, 4$$$] and give $$$3$$$ of the following queries:   $$$a_1 = 3$$$, $$$b_1 = 5$$$It is possible to travel from station $$$3$$$ to station $$$5$$$ by taking a section of the route consisting of stations [$$$3, 7, 1, 5$$$]. Answer: YES.  $$$a_2 = 1$$$, $$$b_2 = 7$$$You cannot travel from station $$$1$$$ to station $$$7$$$ because the train cannot travel in the opposite direction. Answer: NO.  $$$a_3 = 3$$$, $$$b_3 = 10$$$It is not possible to travel from station $$$3$$$ to station $$$10$$$ because station $$$10$$$ is not part of the train's route. Answer: NO. 

Input: The first line of the input contains an integer $$$t$$$ ($$$1 \le t \le 10^4$$$) —the number of test cases in the test.The descriptions of the test cases follow.The first line of each test case is empty.The second line of each test case contains two integers: $$$n$$$ and $$$k$$$ ($$$1 \le n \le 2 \cdot 10^5, 1 \le k \le 2 \cdot 10^5$$$) —the number of stations the train route consists of and the number of queries.The third line of each test case contains exactly $$$n$$$ integers $$$u_1, u_2, \dots, u_n$$$ ($$$1 \le u_i \le 10^9$$$). The values $$$u_1, u_2, \dots, u_n$$$ are not necessarily different.The following $$$k$$$ lines contain two different integers $$$a_j$$$ and $$$b_j$$$ ($$$1 \le a_j, b_j \le 10^9$$$) describing the query with index $$$j$$$.It is guaranteed that the sum of $$$n$$$ values over all test cases in the test does not exceed $$$2 \cdot 10^5$$$. Similarly, it is guaranteed that the sum of $$$k$$$ values over all test cases in the test also does not exceed $$$2 \cdot 10^5$$$

Output: For each test case, output on a separate line:  YES, if you can travel by train from the station with index $$$a_j$$$ to the station with index $$$b_j$$$ NO otherwise. You can output YES and NO in any case (for example, strings yEs, yes, Yes and YES will be recognized as a positive response).

Note: The first test case is explained in the problem statement.

Sample Inputs:
3
6 3
3 7 1 5 1 4
3 5
1 7
3 10
3 3
1 2 1
2 1
1 2
4 5
7 5
2 1 1 1 2 4 4
1 3
1 4
2 1
4 1
1 2

Sample Outputs:
YES
NO
NO
YES
YES
NO
NO
YES
YES
NO
YES

Solution (Python):
import os, io, sys
inpt = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline
x = int(inpt())
res = []
for _ in range(x):
    inpt()
    (n, k) = inpt().split()
    sched = inpt().split()
    dict = {}
    for (i, stop) in enumerate(sched):
        if stop not in dict:
            dict[stop] = [i, i]
        else:
            dict[stop][1] = i
    for _ in range(int(k)):
        (a, b) = inpt().split()
        if a not in dict or b not in dict:
            res.append('NO\n')
        elif dict[a][0] < dict[b][1]:
            res.append('YES\n')
        else:
            res.append('NO\n')
sys.stdout.write(''.join(res))

Solution (Python):
import sys
input = sys.stdin.readline
for _ in range(int(input())):
    _ = input()
    (n, k) = map(int, input().split())
    u = input().split()
    first = {item: n - i - 1 for (i, item) in enumerate(reversed(u))}
    last = {item: i for (i, item) in enumerate(u)}
    for _ in range(k):
        (a, b) = input().split()
        if a in first and b in last and (first[a] <= last[b]):
            sys.stdout.write('YES\n')
        else:
            sys.stdout.write('NO\n')

Solution (Python):
import sys
input = sys.stdin.readline
t = int(input())
for _ in range(t):
    empt = input()
    (n, q) = input().split()
    s = input().split()
    d1 = dict()
    d2 = dict()
    for (i, j) in enumerate(s):
        if j not in d1:
            d1[j] = i
        d2[j] = i
    for i in range(int(q)):
        (q1, q2) = input().split()
        if q1 in d1 and q2 in d2 and (int(d1[q1]) < int(d2[q2])):
            sys.stdout.write('Yes\n')
        else:
            sys.stdout.write('No\n')