이 문제는 길이 \(N\) 수열에 대해 중간 삽입/삭제/값 변경이 있고, 구간 \([l,r]\)에서
\(\sum A_i \cdot (i-l+1)^k \pmod{2^{32}}\) 를 질의한다(\(0 \le k \le 10\)).
핵심은 수열이 계속 변하므로 세그먼트 트리/펜윅처럼 고정 인덱스 구조가 어렵고, 대신 implicit treap(랜덤 BST) 로 “순서”를 관리하며 다항 합을 유지하는 것이다.
문제 정보
문제 링크: https://www.acmicpc.net/problem/13543
문제 요약:
1 p v: \(A_p\) 앞에 값 \(v\)를 삽입한다. (끝 삽입 포함)2 p: \(A_p\) 를 삭제한다.3 p v: \(A_p \leftarrow v\) 로 변경한다.4 l r k: \(\displaystyle \sum_{i=l}^{r} A_i \cdot (i-l+1)^k \pmod{2^{32}}\) 를 출력한다.
제한 조건:
- 시간 제한: 2초
- 메모리 제한: 512MB
- \(1 \le N, M \le 100{,}000\)
- \(0 \le A_i, v < 2^{32}\)
- 인덱스는 0-based
- \(0 \le k \le 10\)
입출력 예제
입력 1:
| |
출력 1:
| |
접근 방식
핵심 관찰 1: 쿼리 4는 “구간 내부에서 1부터 시작하는 인덱스”만 필요
4 l r k 는 \((i-l+1)^k\) 형태이므로, \([l,r]\) 구간만 따로 떼어내서 그 안에서 위치를 \(1..len\) 으로 보면 된다.
즉, 자료구조에서 split로 구간을 분리할 수 있으면 답은 그 구간의 정보만으로 계산된다.
핵심 관찰 2: implicit treap으로 “배열”을 구현한다
implicit treap은 BST key를 따로 저장하지 않고, 서브트리 크기로 “k번째 원소”를 찾는다.
split(root, k): 앞에서 k개를 왼쪽 트리로, 나머지를 오른쪽 트리로 분리merge(a, b): a의 모든 원소가 b보다 앞에 오도록 병합
이 두 연산으로 삽입/삭제/구간 분리를 모두 \(O(\log N)\) 에 처리한다.
핵심 관찰 3: 노드에 \(\sum A_i \cdot i^k\) (0≤k≤10) 를 저장한다
각 treap 노드(서브트리)에서 “서브트리 내부 위치(pos=1..)” 기준으로 다음을 유지한다.
sum[k] = Σ (A_pos * pos^k) mod 2^32sz = 서브트리 크기
그러면 4 l r k 는 트리를 split 해서 구간 트리 mid 를 얻고, mid.sum[k] 가 바로 정답이다.
핵심 관찰 4: merge/pull 시 오른쪽 서브트리의 위치 shift는 이항정리로 처리
왼쪽 크기를 L, 현재 노드가 1개이므로 오른쪽 서브트리의 모든 위치는 delta = L+1 만큼 증가한다.
따라서 오른쪽의 sumR[j] 들을 이용해 shift된 sum을 \(O(K^2)\) 로 계산할 수 있고,
\(K \le 10\) 이라 충분히 빠르다.
알고리즘 설계 (Mermaid Flowchart)
flowchart TD
A["입력 N, 배열 A"] --> B["implicit treap 구축노드: val, sz, sum[0..10]"]
B --> C["쿼리 M개 처리"]
C --> D{"type 확인"}
D -->|"type 1: 1 p v"| E["split(root,p)=(a,b)root=merge(merge(a,new(v)),b)"]
D -->|"type 2: 2 p"| F["split(root,p)=(a,b)split(b,1)=(mid,c)root=merge(a,c)"]
D -->|"type 3: 3 p v"| G["split(root,p)=(a,b)split(b,1)=(mid,c)mid.val=vpull(mid)root=merge(merge(a,mid),c)"]
D -->|"type 4: 4 l r k"| H["split(root,l)=(a,b)split(b,r-l+1)=(mid,c)출력 mid.sum[k]root=merge(merge(a,mid),c)"]
복잡도 분석
| 항목 | 복잡도 | 비고 |
|---|---|---|
| 시간 복잡도 | \(O(M \cdot K^2 \log N)\) | \(K \le 10\), split/merge마다 \(O(K^2)\) pull |
| 공간 복잡도 | \(O(N \cdot K)\) | 노드당 sum[0..10] 저장 |
코너 케이스 및 실수 포인트
| 케이스 | 설명 | 처리 방법 |
|---|---|---|
| mod \(2^{32}\) | signed overflow는 UB | uint32_t로 계산(부호없는 overflow는 mod \(2^{32}\)) |
| 삽입이 끝(p=len) | 범위가 0 ≤ p ≤ len | split(root,p)로 자연 처리 |
| 삭제/갱신 범위 | 0 ≤ p < len | split(b,1)로 원소 1개 분리 |
| k=0 | \((i-l+1)^0=1\) | sum[0]=구간 합이 되도록 정의 |
| 빈 구간 | 입력상 l ≤ r로 보장 | 그래도 mid==nullptr일 때 0 처리 |
구현 코드
C++
| |
![Featured image of post [Algorithm] C++ 백준 13543번: 수열과 쿼리 2](/post/algorithm/2025-12-20-boj-13543-sequence-and-queries-2-implicit-treap-cpp-solution/wordcloud_hu_ca49ff707f70f4b0.png)
![[Algorithm] C++ 백준 10050번: 블록](/post/algorithm/2025-12-20-boj-10050-block-cpp-solution/wordcloud_hu_ed188e3b2b566e60.png)
![[Algorithm] C++ 백준 13543번: 수열과 쿼리 2](/post/algorithm/2025-12-20-boj-13543-sequence-and-queries-2-implicit-treap-cpp-solution/wordcloud_hu_1e4eb6a3efec537a.png)
![[Algorithm] C++ 백준 17372번: 피보나치 수의 최대공약수의 합](/post/algorithm/2025-12-20-boj-17372-fibonacci-gcd-sum-cpp-solution/wordcloud_hu_94c5bd100eedf3e2.png)
![[Algorithm] C++ 백준 32231번: 재우의 삼수강](/post/algorithm/2025-12-20-boj-32231-jaewoos-third-retake-hyperbolic-geometry-cpp-solution/wordcloud_hu_6b5d9f28adedfd92.png)
![[Algorithm] C++ 백준 3752번: 최대공약수 행렬식](/post/algorithm/2025-12-20-boj-3752-gcd-matrix-determinant-cpp-solution/wordcloud_hu_1490cf2b4f293afc.png)
![[Algorithm] C++ 백준 13539번: 트리와 쿼리 11](/post/algorithm/2025-12-19-boj-13539-tree-and-query-11-link-cut-tree-cpp-solution/wordcloud_hu_22549d9781144aba.png)
![[Algorithm] C++ 백준 3006번: 터보소트](/post/algorithm/2025-12-19-boj-3006-turbosort-cpp-solution/wordcloud_hu_cd4b400156e60fdb.png)
![[Algorithm] C++ 백준 31222번 : 수열과 어렵지 않은 쿼리](/post/algorithm/2025-12-12-boj-31222-sequence-and-not-so-hard-queries-cpp-solution/wordcloud_hu_6068bcd736ddbb4b.png)
![[Algorithm] C++ 백준 32190번: Ian Sequences](/post/algorithm/2025-12-19-boj-32190-ian-sequences-cpp-solution/wordcloud_hu_266416599cd1461b.png)
![[Algorithm] C++ 백준 33543번: 둘이 한 팀](/post/algorithm/2025-12-19-boj-33543-two-in-a-team-cpp-solution/wordcloud_hu_791f9bd4be457f3c.png)