RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
포럼
R01524

역전수와 동적 점 갱신

Platinum III 플래티넘 III
난이도
2s
시간 제한
256MB
메모리 제한
0
맞았습니다!!
0
제출 수
0.0%
정답률
레이팅

의견: 0

설명

실시간 순위 시스템에서 각 참가자의 점수가 길이 \(N\) 인 배열 \(a_1, a_2, \dots, a_N\) 으로 저장되어 있다. 이 배열의 역전수(inversion count)란, \(i < j\) 이면서 \(a_i > a_j\) 인 순서쌍 \((i, j)\) 의 개수이다. 즉 앞에 있는 점수가 뒤에 있는 점수보다 큰 쌍의 개수로, 순위가 얼마나 뒤섞여 있는지를 나타내는 척도이다.

이제 \(Q\) 번의 점수 갱신이 차례로 들어온다. 각 갱신은 "위치 \(p\) 의 점수를 \(v\) 로 바꾼다"로 이루어지며, 매 갱신을 적용한 직후의 역전수를 출력해야 한다.

예를 들어 배열이 \([3, 1, 4, 1, 5]\) 라면 역전수는 \(3\) 이다 (\((3,1), (3,1), (4,1)\)). 여기서 세 번째 값을 \(0\) 으로 바꾸어 \([3, 1, 0, 1, 5]\) 가 되면 역전수는 \(4\) 가 된다.

갱신마다 배열 전체를 다시 세면 너무 느리다. 한 위치의 값만 바뀌었을 때 그 위치가 관여하는 쌍들만 살펴보면 역전수의 변화량을 빠르게 계산할 수 있다는 점을 이용하라.

제약

\(1 \le N \le 200{,}000\)

\(1 \le Q \le 200{,}000\)

\(1 \le p \le N\)

모든 점수의 절댓값은 \(10^9\) 이하이다.

역전수는 최대 \(\binom{N}{2} \approx 2 \times 10^{10}\) 까지 커질 수 있으므로 64비트 정수를 사용해야 한다.

입력 형식

첫째 줄에 두 정수 \(N\)\(Q\) (\(1 \le N \le 200{,}000\), \(1 \le Q \le 200{,}000\)) 가 주어진다.

둘째 줄에 \(N\) 개의 정수 \(a_1, a_2, \dots, a_N\) 이 주어진다.

이어서 \(Q\) 개의 줄에 각각 두 정수 \(p\)\(v\) (\(1 \le p \le N\)) 가 주어지며, 위치 \(p\) (1-based) 의 점수를 \(v\) 로 바꾸라는 뜻이다.

입력되는 모든 점수의 절댓값은 \(10^9\) 이하의 정수이다.

출력 형식

\(Q\) 개의 줄을 출력한다. \(k\) 번째 줄에는 \(k\) 번째 갱신을 적용한 직후의 배열의 역전수를 출력한다.

예제 1
입력
5 2
3 1 4 1 5
3 0
5 9
출력
4
4
설명

초기 배열 [3, 1, 4, 1, 5]의 역전수는 3 입니다 ((3,1),(3,1),(4,1)).

1) 3번째 값을 0으로 바꾸면 [3, 1, 0, 1, 5]: 역전수는 (3,1),(3,0),(3,1),(1,0) = 4.

2) 5번째 값을 9로 바꾸면 [3, 1, 0, 1, 9]: 9는 맨 뒤의 최댓값이라 새 역전을 만들지 않으므로 역전수는 그대로 4.

예제 2
입력
3 1
1 2 3
1 5
출력
2
설명

정렬된 [1, 2, 3]은 역전수 0.

1번째 값을 5로 바꾸면 [5, 2, 3]: (5,2),(5,3) 두 쌍이므로 2.

문제 정보

riseoj 작성

출처 Original

평가 및 의견

역전수와 동적 점 갱신

개요
출제자 난이도 Platinum III 플래티넘 III 의견 0 / 50 공개 집계 (커뮤니티 난이도, 주요 주제, 품질)는 의견이 충분히 모이면 공개됩니다.

Log in to rate problems.

개별 의견

아직 의견이 없습니다. 자격이 된다면 위 양식에서 가장 먼저 평가해 보세요.

풀이 제출

역전수와 동적 점 갱신

게스트로 둘러보고 있습니다. 로그인하면 풀이를 제출하고 진행 상황을 확인할 수 있습니다. 로그인하고 제출하기
공개
C++20 Tab 들여쓰기 · Ctrl+/ 주석 토글 · Enter 자동 들여쓰기
1 1 1 0 공백: 4 · UTF-8