목차

자동차 공장

ps
링크acmicpc.net/…
출처BOJ
문제 번호2820
문제명자동차 공장
레벨플래티넘 3
분류

구간 쿼리

시간복잡도O(n+mlogn)
인풋사이즈n<=500,000, m<=500,000
사용한 언어Python
제출기록194440KB / 4036ms
최고기록3372ms
해결날짜2021/04/05
태그

48단계

풀이

코드

"""Solution code for "BOJ 2820. 자동차 공장".

- Problem link: https://www.acmicpc.net/problem/2820
- Solution link: http://www.teferi.net/ps/problems/boj/2820
"""

import sys
from teflib import fenwicktree
from teflib import tgraph


def euler_tour_techinique(tree, root):
    subtree_ranges = [[None, None] for _ in tree]
    order = 0
    for node in tgraph.dfs(tree, root, yields_on_leave=True):
        if subtree_ranges[node][0] is None:
            subtree_ranges[node][0] = order
            order += 1
        else:
            subtree_ranges[node][1] = order
    return subtree_ranges


def main():
    N, M = [int(x) for x in sys.stdin.readline().split()]
    tree = [[] for _ in range(N)]
    salaries = [int(sys.stdin.readline())]
    for i in range(1, N):
        salary, boss = [int(x) for x in sys.stdin.readline().split()]
        salaries.append(salary)
        tree[boss - 1].append(i)

    subtree_ranges = euler_tour_techinique(tree, 0)
    fenwick = fenwicktree.FenwickTree(N + 1)
    for i in range(M):
        query = sys.stdin.readline().split()
        if query[0] == 'p':
            a, x = int(query[1]), int(query[2])
            beg, end = subtree_ranges[a - 1]
            beg += 1
            if beg < end:
                fenwick.update(beg, x)
                fenwick.update(end, -x)
        else:
            a = int(query[1])
            pos = subtree_ranges[a - 1][0]
            print(fenwick.query(0, pos + 1) + salaries[a - 1])


if __name__ == '__main__':
    main()