목차

수열과 쿼리 22

ps
링크acmicpc.net/…
출처BOJ
문제 번호16978
문제명수열과 쿼리 22
레벨플래티넘 3
분류

구간 쿼리

시간복잡도O(mlogn)
인풋사이즈n<=100,000, m<=100,000
사용한 언어Python
제출기록68128KB / 820ms
최고기록820ms
해결날짜2021/03/18

풀이

코드

"""Solution code for "BOJ 16978. 수열과 쿼리 22".

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

import sys
from teflib import fenwicktree


def main():
    N = int(sys.stdin.readline())  # pylint: disable=unused-variable
    A = [int(x) for x in sys.stdin.readline().split()]
    M = int(sys.stdin.readline())
    sum_queries = [[] for _ in range(M)]
    sum_query_num = 0
    update_queries = []
    for _ in range(M):
        query = [int(x) for x in sys.stdin.readline().split()]
        if query[0] == 1:
            _, i, v = query
            update_queries.append((i - 1, v))
        else:
            _, k, i, j = query
            sum_queries[k].append((i - 1, j, sum_query_num))
            sum_query_num += 1

    answers = [0] * sum_query_num
    fenwick = fenwicktree.FenwickTree(A)
    for i, (pos, value) in enumerate(update_queries):
        for beg, end, n in sum_queries[i]:
            answers[n] = fenwick.query(beg, end)
        fenwick.set(pos, value)
    for beg, end, n in sum_queries[len(update_queries)]:
        answers[n] = fenwick.query(beg, end)

    print(*answers, sep='\n')


if __name__ == '__main__':
    main()