아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

산맥

시간 제한3초메모리 제한256 MB

요약
구간 대입으로 변하는 높이 변화량 배열에서, 주어진 높이 h를 처음 넘어서는 지점의 위치를 각 질의마다 구한다.
난이도

어려움10점 중 8점

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

문제

어떤 놀이공원에 새로운 롤러코스터 시뮬레이터가 설치되었다. 시뮬레이션 트랙은 nn개의 레일이 끝과 끝을 맞대어 이어진 형태이며, 첫 번째 레일의 시작점은 높이 00에 고정되어 있다.

시뮬레이터는 트랙을 nn개의 높이 변화량 d1,d2,…,dnd_1, d_2, \dots, d_n의 수열로 저장한다. did_i는 ii번째 레일을 지나는 동안의 높이 변화량(cm)이다. 즉, 어떤 차량이 i−1i-1개의 레일을 지난 뒤 높이 ee에 있었다면, ii번째 레일을 지난 뒤에는 높이 e+die + d_i에 있게 된다. 따라서 출발점의 높이는 00이고, ii개의 레일을 지난 뒤의 높이는 d1+d2+⋯+did_1 + d_2 + \dots + d_i이다.

처음에는 모든 레일이 수평이다. 즉, 모든 ii에 대해 di=0d_i = 0이다.

하루 동안 다음 두 종류의 사건이 번갈아 발생한다.

  • 재구성: 세 정수 aa, bb, DD로 주어진다. a≤i≤ba \le i \le b를 만족하는 모든 레일 ii의 높이 변화량을 di=Dd_i = D로 설정한다. 다른 레일의 높이 변화량은 바뀌지 않는다. 시작점의 높이는 계속 00으로 유지되며, 이어지는 트랙 전체가 연결 상태를 유지하도록 필요한 만큼 위나 아래로 평행 이동한다.
  • 탑승: 하나의 정수 hh로 주어진다. 차량을 높이 hh까지 도달할 수 있는 에너지로 출발시킨다. 차량은 트랙의 높이가 hh를 넘지 않는 동안, 그리고 트랙의 끝에 도달하지 않은 동안 계속 나아간다.

각 탑승에 대해, 차량이 멈추기 전까지 완전히 지나간 레일의 개수를 구하여라.

입력

첫째 줄에 레일의 개수 nn이 주어진다 (1≤n≤1091 \le n \le 10^9).

이후 여러 줄에 걸쳐 재구성과 탑승이 번갈아 주어지고, 마지막에 종료 표시가 주어진다. 각 줄은 다음 중 하나이다.

  • 재구성: 문자 I와 세 정수 aa, bb, DD가 공백 하나로 구분되어 주어진다 (1≤a≤b≤n1 \le a \le b \le n, −109≤D≤109-10^9 \le D \le 10^9). a≤i≤ba \le i \le b인 모든 레일에 대해 di=Dd_i = D로 설정한다.
  • 탑승: 문자 Q와 정수 hh가 공백 하나로 구분되어 주어진다 (0≤h≤1090 \le h \le 10^9).
  • 문자 E 하나: 입력의 끝을 나타내는 종료 표시.

어느 순간에도 트랙 위 모든 지점의 높이는 구간 [0,109][0, 10^9] cm 안에 있다고 가정해도 좋다. 입력은 최대 100 000100\,000줄이다.

전체 테스트의 50%50\%에서는 nn이 1≤n≤20 0001 \le n \le 20\,000을 만족하며, 입력이 1 0001\,000줄을 넘지 않는다.

출력

각 탑승에 대해 한 줄씩, 차량이 지나간 레일의 개수를 정수 하나로 출력한다. ii번째 줄에는 ii번째 탑승의 결과를 출력한다.

힌트

각 재구성 전후의 트랙 모습이다. 가로축은 레일 번호를, 세로축과 점 위의 숫자는 높이를, 선분 위의 숫자는 높이 변화량을 나타낸다.

예제2

  1. 예제 1

    입력
    4
    Q 1
    I 1 4 2
    Q 3
    Q 1
    I 2 2 -1
    Q 3
    E
    
    예상 출력
    4
    1
    0
    3
    
  2. 예제 2

    입력
    5
    I 1 5 2
    Q 7
    Q 8
    Q 10
    Q 1
    E
    
    예상 출력
    3
    4
    5
    0