만드는 중입니다

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

리스트 가상화

시간 제한6초메모리 제한1024 MB

요약
높이가 주어진 직사각형을 쌓인 순서대로 삽입하고 삭제하며, 위에서 t부터 b까지 구간과 내부가 겹치는 직사각형의 개수를 구합니다.
난이도

보통10점 중 7점

유형
트리, 누적 합, 이분 탐색
정답자
아직 제출이 없습니다

문제

한국정보기술진흥원에서 새로 개발한 모바일 어플리케이션의 화면에는 NN개의 직사각형 항목이 빈틈없이 세로로 나열되어 있다. 위에서 ii번째 항목의 높이는 HiH_i이다. 가장 위에 있는 항목의 위쪽 변은 화면의 맨 위와 맞닿아 있다. 사용자의 요청 QQ개를 순서대로 처리해야 한다. 어떤 요청에서도 요청 전에 있던 항목들의 순서가 요청 후에 뒤바뀌지 않는다.

  • 1 ii hh: 높이가 hh인 새 직사각형 항목을 위에서 ii번째에 끼워 넣는다. j<ij \lt i인 모든 jj에 대해 새 항목은 위에서 jj번째 항목보다 아래에 있게 된다. j≥ij \ge i인 항목은 끼워 넣기 전에 위에서 jj번째였던 항목으로, 새 항목보다 아래로 내려간다. 움직인 뒤에도 모든 항목은 빈틈없이 나열되어야 한다.
  • 2 ii: 위에서 ii번째 항목을 지운다. j>ij \gt i인 항목은 지우기 전에 위에서 jj번째였던 항목으로, 모든 항목이 빈틈없이 나열되도록 위로 움직인다.
  • 3 tt bb: 화면 맨 위에서 tt만큼 떨어진 위치부터 bb만큼 떨어진 위치까지의 범위에, 직사각형 경계를 제외한 내부의 점이 하나 이상 포함되는 항목의 수를 구한다.

입력

첫 줄에는 처음 화면에 있는 항목의 수 NN과 요청의 수 QQ가 공백으로 구분되어 주어진다. (1≤N,Q≤200 000)(1 \le N, Q \le 200\,000)

둘째 줄에는 각 항목의 높이 H1,H2,⋯ ,HNH_1, H_2, \cdots, H_N이 공백으로 구분되어 주어진다. (1≤Hi≤1 000 000 000)(1 \le H_i \le 1\,000\,000\,000)

셋째 줄부터 QQ개의 줄에 걸쳐 요청이 주어진다. 요청은 다음 형식 중 하나를 따른다.

  • 1 ii hh (1≤i≤(1 \le i \le (요청 직전에 존재하는 항목의 수) +1+ 1, 1≤h≤1 000 000 000)1 \le h \le 1\,000\,000\,000)
  • 2 ii (1≤i≤(1 \le i \le (요청 직전에 존재하는 항목의 수)))
  • 3 tt bb (0≤t<b≤400 000 000 000 000)(0 \le t \lt b \le 400\,000\,000\,000\,000)

출력

3 tt bb 요청이 들어올 때마다, 화면 맨 위에서 tt만큼 떨어진 위치부터 bb만큼 떨어진 위치까지의 범위에 직사각형 경계를 제외한 내부의 점이 하나 이상 포함되는 항목의 수를 한 줄에 출력한다.

예제2

  1. 예제 1

    입력
    5 9
    5 3 2 3 1
    3 8 16
    1 5 5
    3 8 23
    2 3
    3 4 19
    3 6 12
    2 3
    1 5 3
    3 7 9
    
    예상 출력
    3
    4
    5
    3
    2
    
  2. 예제 2

    입력
    5 20
    5 1 1 4 4
    3 5 14
    2 5
    3 2 11
    3 6 20
    1 3 2
    3 1 14
    1 4 5
    2 5
    1 4 4
    3 6 16
    1 4 4
    3 0 10
    3 3 9
    2 2
    3 15 24
    3 2 9
    2 4
    2 1
    1 5 4
    3 19 20
    
    예상 출력
    4
    4
    2
    5
    3
    4
    4
    2
    3
    0