토큰 거리
시간 제한2초메모리 제한512 MB
칸 위의 토큰이 이동하는 상황에서, 번호가 L부터 R까지인 토큰을 칸 번호순(같으면 토큰 번호순)으로 정렬했을 때 간격이 모두 같은지 판별합니다.
문제
0번부터 번까지 번호가 붙은 칸이 있는 보드 게임을 하고 있다. 1번부터 N번까지 번호가 붙은 토큰이 N개 있으며, 각 토큰은 한 칸에 놓여 있다. 여러 토큰이 같은 칸에 있을 수도 있다. 처음에 토큰 i는 번 칸에 있다. 두 토큰의 거리는 첫 번째 토큰이 있는 칸 번호와 두 번째 토큰이 있는 칸 번호의 차이이다.
토큰의 집합 S가 잘 떨어져 있는지 다음과 같이 확인한다.
- S에 속한 토큰을 칸 번호의 오름차순으로 정렬한 목록을 A라고 한다. 같은 칸에 있는 토큰은 토큰 번호의 오름차순으로 정렬한다.
- A에 토큰이 세 개 미만이면 잘 떨어져 있다.
- 그렇지 않으면, A에서 이웃한 토큰 사이의 거리가 모두 같을 때에만 잘 떨어져 있다. A에서 인덱스 차이가 1인 두 토큰을 이웃한다고 한다.
다음 두 종류의 연산을 Q번 수행한다.
- 토큰 X를 칸 Y로 옮긴다.
- 토큰 번호가 L부터 R까지(양 끝 포함)인 토큰의 집합이 잘 떨어져 있는지 보고한다.
입력
첫 줄에 토큰의 개수 N과 연산의 개수 Q가 주어진다(; ). 다음 줄에는 토큰의 초기 칸 ()가 N개 주어진다. 이후 Q개의 줄에는 다음 중 하나의 연산이 주어진다.
1 X Y(; ): 토큰 X를 칸 Y로 옮긴다.2 L R(): 토큰 번호가 L부터 R까지인 토큰이 잘 떨어져 있는지 확인한다.
두 번째 종류의 연산은 적어도 하나 주어진다.
출력
두 번째 종류의 각 연산마다 입력 순서대로 한 줄에 YES 또는 NO를 출력한다. L부터 R까지의 토큰이 잘 떨어져 있으면 YES, 그렇지 않으면 NO를 출력한다.