페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#6126

[Tutorial] imos 알고리즘 1초 1024MB

문제

imos 알고리즘 (또는 imos법)은 시작점과 끝점이 주어진 구간을 처리하는 데 유용한 기법이다.

각 지점에서의 변경 값을 저장하고 누적하여 계산함으로써 가장 중첩되는 영역을 구할 수 있는데, 쿼리 처리 도중 값 갱신이 일어나지 않는 경우에 사용된다.

각 쿼리가 구간 [s, e] 내의 값을 갱신시키는 경우, 이를 매 쿼리마다 일일히 갱신하지 않고, 시작과 끝만 기록해두었다가 마지막에 한 번의 처리로 값을 처리해주는 방법이다.

예를 들어 [2, 4] 구간에 2를 더하고, [3, 5] 구간에 3을 더한다면,

  • 우선 2에 2를 더하고, 4 다음 위치인 5에 -2를 더한다.

  • 그 다음 3에 3을 더하고, 5 다음 위치인 6에 -3을 더한다.

  • 마지막으로 처음부터 끝까지 누적하여 더해준다.

1

2

3

4

5

6

초기

0

0

0

0

0

0

[2, 4] +2

0

2

0

0

-2

0

[3, 5] +3

0

2

3

0

-2

-3

최종

0

2

5

5

3

0

아래 문제를 풀어보며 자세한 감을 잡아보자.

[문제]
imos 라멘집에는 오늘 N팀의 손님들이 방문했다.

i번째 팀은 C_i명의 사람들로 이루어져 있으며 S_i 시간에 입장하여 E_i 시간까지 가게에 있다가 떠났다.

imos 라멘집의 사장님은 T_j 시간에 대하여 몇 명의 손님이 있었는지 Q번 물어본다.

이를 출력해주는 프로그램을 작성하시오.


입력

첫 줄에 정수 N이 주어진다. (1 \le N \le 10^5)

두 번째 줄부터 N줄에 걸쳐 세 정수 S_i,\ E_i,\ C_i가 주어진다. (1 \le S_i,\ E_i \le 10^6, 1 \le C_i \le 100)

그 다음 줄에 정수 Q가 주어진다. (1 \le Q \le 10^5)

이어 Q줄에 걸쳐 정수 T_j가 주어진다. (1 \le T_j \le 10^6)


출력

Q줄에 걸쳐 T_j 시간에 몇 명의 손님이 있었는지 출력한다.


부분문제

번호 점수 조건
#130점

1 \le N,\ Q \le 10, 1 \le S_i,\ E_i,\ T_j \le 100

#270점

추가 제한 없음


예제1

입력
3
253
373
8102
2
4
8
출력
6
2

T (시간)

1

2

3

4

5

6

7

8

9

10

손님 수

0

3

6

6

6

3

3

2

2

2


출처

JUNGOL - klee

역링크