세그먼트 트리를 써 보세요
시간 제한2초메모리 제한512 MB
가중치가 있는 트리에서 경로의 모든 가중치를 같은 값으로 바꾸는 갱신과, 경로 위 가중치 열의 비어 있지 않은 최대 연속 부분합을 구하는 질의를 처리한다. n은 200,000, q는 100,000까지 주어진다.
문제
n (1 ≤ n ≤ 200,000)개의 노드로 이루어진 트리와 q (1 ≤ q ≤ 100,000)개의 쿼리가 주어진다. 쿼리를 순서대로 처리하면서 각 출력 쿼리마다 값을 하나씩 출력한다. 트리는 연결되어 있고, 각 노드에는 가중치 wi (-10,000 ≤ wi ≤ 10,000)가 있다.
각 쿼리는 쿼리의 종류를 나타내는 수 ti (ti = 1, 2)와 세 수 ai, bi, ci (1 ≤ ai, bi ≤ n, -10,000 ≤ ci ≤ 10,000)로 이루어진다. 쿼리의 종류에 따라 다음 중 하나를 처리한다.
-
(
ti = 1: 변경 쿼리)ai와bi사이의 최단 경로에 있는 모든 노드(양 끝 포함)의 가중치를ci로 바꾼다. -
(
ti = 2: 출력 쿼리) 먼저ai와bi사이의 최단 경로에 있는 노드(양 끝 포함)의 가중치를 순서대로 나열한 리스트를 만든다. 그다음 리스트에서 비어 있지 않은 연속 부분 수열의 합의 최댓값을 출력한다. 출력 쿼리에서ci는 무시한다.
입력
첫째 줄에 두 정수 n과 q가 주어진다. 둘째 줄에 w1, w2, ..., wn을 나타내는 n개의 정수가 주어진다.
이어지는 n - 1개의 줄에는 두 정수 si와 ei (1 ≤ si, ei ≤ n)가 주어지며, 이는 si와 ei 사이에 간선이 있음을 뜻한다.
마지막으로 q개의 줄에 위에서 설명한 형식의 정수 네 개로 이루어진 쿼리 목록이 주어진다. 쿼리는 위에서 아래로 하나씩 처리해야 한다.
출력
각 출력 쿼리마다 최대 합을 한 줄에 출력한다.