각 정수 v에 대해 서로 다른 두 정점 v와 −v를 만든다. 또한 왼쪽 끝을 나타내는 정점 L과 오른쪽 끝을 나타내는 정점 R을 만든다.
현재 수열이 [a1,a2,⋯,aN]일 때 다음 무방향 연결을 저장한다.
- L과 −a1을 연결한다.
- 각 1≤i<N에 대해 ai와 −ai+1을 연결한다.
- aN과 R을 연결한다.
모든 정점의 차수는 정확히 1이므로, 각 정점의 유일한 이웃을 배열 mate에 저장할 수 있다.
수열에서 서로 이웃한 두 값이 u,v라면 이 둘은 연결 {u,−v}로 표현된다. 쿼리로 이 두 값의 순서가 뒤집히고 부호도 바뀌면 새 인접쌍은 −v,−u가 된다. 이 인접쌍을 표현하는 연결은 {−v,u}이므로 기존 연결과 같다. 따라서 쿼리 구간 내부의 연결은 하나도 바꿀 필요가 없다.
쿼리의 양 끝을 x,y라 하자. 다음 두 값을 구한다.
ℓ=mate(−x),r=mate(y).
쿼리 전에는 연결 {−x,ℓ}과 {y,r}이 존재한다. 이 두 연결을 지우고 다음 두 연결을 추가한다.
{ℓ,y},{−x,r}.
이는 구간의 첫 원소가 x에서 −y로, 마지막 원소가 y에서 −x로 바뀌는 것을 정확히 표현한다. 각 쿼리는 배열 원소 네 개를 갱신하는 것으로 처리된다.
최종 수열은 L에서 시작하여 복원한다. mate(L)=−a1이므로 첫 원소는 −mate(L)이다. 현재 원소가 v이고 mate(v)=R이면 다음 원소는 −mate(v)이다.
초기화와 최종 복원은 O(N), 각 쿼리는 O(1)이다. 전체 시간 복잡도는 O(N+Q)이고, 메모리 복잡도는 O(N)이다.
Solution written by GPT5.6