만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

토큰 거리

시간 제한2초메모리 제한512 MB

요약
칸 위의 토큰이 이동하는 상황에서, 번호가 L부터 R까지인 토큰을 칸 번호순(같으면 토큰 번호순)으로 정렬했을 때 간격이 모두 같은지 판별합니다.
난이도

보통10점 중 7점

유형
세그먼트 트리, 정렬, 수학
정답자
아직 제출이 없습니다

문제

0번부터 10910^9번까지 번호가 붙은 칸이 있는 보드 게임을 하고 있다. 1번부터 N번까지 번호가 붙은 토큰이 N개 있으며, 각 토큰은 한 칸에 놓여 있다. 여러 토큰이 같은 칸에 있을 수도 있다. 처음에 토큰 i는 TiT_i번 칸에 있다. 두 토큰의 거리는 첫 번째 토큰이 있는 칸 번호와 두 번째 토큰이 있는 칸 번호의 차이이다.

토큰의 집합 S가 잘 떨어져 있는지 다음과 같이 확인한다.

  • S에 속한 토큰을 칸 번호의 오름차순으로 정렬한 목록을 A라고 한다. 같은 칸에 있는 토큰은 토큰 번호의 오름차순으로 정렬한다.
  • A에 토큰이 세 개 미만이면 잘 떨어져 있다.
  • 그렇지 않으면, A에서 이웃한 토큰 사이의 거리가 모두 같을 때에만 잘 떨어져 있다. A에서 인덱스 차이가 1인 두 토큰을 이웃한다고 한다.

다음 두 종류의 연산을 Q번 수행한다.

  1. 토큰 X를 칸 Y로 옮긴다.
  2. 토큰 번호가 L부터 R까지(양 끝 포함)인 토큰의 집합이 잘 떨어져 있는지 보고한다.

입력

첫 줄에 토큰의 개수 N과 연산의 개수 Q가 주어진다(2≤N≤100 0002 \le N \le 100\,000; 1≤Q≤100 0001 \le Q \le 100\,000). 다음 줄에는 토큰의 초기 칸 TiT_i(0≤Ti≤1090 \le T_i \le 10^9)가 N개 주어진다. 이후 Q개의 줄에는 다음 중 하나의 연산이 주어진다.

  • 1 X Y (1≤X≤N1 \le X \le N; 0≤Y≤1090 \le Y \le 10^9): 토큰 X를 칸 Y로 옮긴다.
  • 2 L R (1≤L<R≤N1 \le L < R \le N): 토큰 번호가 L부터 R까지인 토큰이 잘 떨어져 있는지 확인한다.

두 번째 종류의 연산은 적어도 하나 주어진다.

출력

두 번째 종류의 각 연산마다 입력 순서대로 한 줄에 YES 또는 NO를 출력한다. L부터 R까지의 토큰이 잘 떨어져 있으면 YES, 그렇지 않으면 NO를 출력한다.

예제1

  1. 예제 1

    입력
    5 7
    1 1 1 10 1
    2 1 3
    2 1 5
    1 5 4
    1 3 7
    2 2 4
    2 2 5
    2 4 5
    
    예상 출력
    YES
    NO
    NO
    YES
    YES