목차

성대나라의 물탱크

ps
링크acmicpc.net/…
출처BOJ
문제 번호18227
문제명성대나라의 물탱크
레벨플래티넘 3
분류

구간 쿼리

시간복잡도O(n+mlogn)
인풋사이즈n<=200,000, m<=200,000
사용한 언어Python
제출기록112764KB / 2376ms
최고기록2376ms
해결날짜2021/04/30

풀이

코드

"""Solution code for "BOJ 18227. 성대나라의 물탱크".

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

import sys
from teflib import fenwicktree
from teflib import tgraph


def main():
    N, C = [int(x) for x in sys.stdin.readline().split()]
    graph = [[] for _ in range(N)]
    for _ in range(N - 1):
        x, y = [int(x) for x in sys.stdin.readline().split()]
        graph[x - 1].append(y - 1)
        graph[y - 1].append(x - 1)

    order = level = 0
    subtree_ranges = [[None, None] for _ in range(N)]
    levels = [None] * N
    for node in tgraph.dfs(graph, C - 1, yields_on_leave=True):
        if subtree_ranges[node][0] is None:
            subtree_ranges[node][0] = order
            order += 1
            level += 1
            levels[node] = level
        else:
            subtree_ranges[node][1] = order
            level -= 1
    fenwick = fenwicktree.FenwickTree(N)

    Q = int(sys.stdin.readline())
    for _ in range(Q):
        query_type, A = [int(x) for x in sys.stdin.readline().split()]
        if query_type == 1:
            fenwick.update(subtree_ranges[A - 1][0], 1)
        else:
            print(fenwick.query(*subtree_ranges[A - 1]) * levels[A - 1])


if __name__ == '__main__':
    main()