Skip to content

Conversation

@g0rnn
Copy link
Collaborator

@g0rnn g0rnn commented Jul 28, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

์ปคํ”ผ์†2

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

1h

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

30๋ถ„ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์–ด์„œ ๊ทธ๋ƒฅ ๋‹ต์ง€ ๋ดค์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ฒ˜์Œ ์ƒ๊ฐํ–ˆ๋˜๊ฑด ๋ˆ„์ ํ•ฉ์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ฐ”๋€Œ์–ด์•ผํ•  (idx, val)๋ฅผ ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ณ  ์ •๋‹ต์„ ๊ณ„์‚ฐํ•  ๋•Œ ์ฐจ๊ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.

nums = [1, 2, 3, 4, 5]
prefixSum = [1, 3, 6, 10, 15]
while :
    #print
    long ans = prefixSum[y-1] - prefixSum[x-2]
    idx, val = queue.pop()
    if x <= idx <= y: 
        ans - (nums[idx] - val)
    print(ans)

    #change
    queue.add({a, b})

์–ด๋–ค ์›์†Œ๊ฐ€ 3 -> 1์ด ๋˜๋ฉด ๊ตฌ๊ฐ„ํ•ฉ์€ -2๊ฐ€ ๊ฐ์†Œํ•˜๋Š”๊ฑฐ๋‹ˆ ๋ฌธ์ œ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ ๊ฒ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„ O(N^2)์ด๋‹ˆ๊นŒ์š”. ๊ตณ์ด ๋”ฐ์ง€์ž๋ฉด N(N-1) / 2์ด๊ธด ํ•˜์ง€๋งŒ ์•„๋ฌดํŠผ ํ†ต๊ณผํ•˜์ง„ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„  ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ „์— ํ•œ๋ฒˆ ํ’€์–ด๋ดค๋˜๊ฑฐ ๊ฐ™์€๋ฐ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜์ง€ ์•Š์•„ ๋‹ค ๊นŒ๋จน์—ˆ์Šต๋‹ˆ๋‹ค ^^;

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ž€ ๊ตฌ๊ฐ„ํ•ฉ์„ ํŠธ๋ฆฌํ˜•์‹์œผ๋กœ ์ €์žฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ฐ„ํ•ฉ์„ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•ด์•ผํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌํ”„๋…ธ๋“œ : ๋ฐฐ์—ด์˜ ๊ทธ ์ˆ˜ ์ž์ฒด
  • ๋ฆฌํ”„๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ : ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ํ•ฉ์„ ์ €์žฅ

๋ฆฌํ”„๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ์—์„œ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ํ•ฉ์„ ์ €์žฅํ•˜๊ธฐ์— ๊ตฌ๊ฐ„ ํ•ฉ์ด ์™„์„ฑ๋˜๋Š” ๊ฒ๋‹ˆ๋‹ค.
image

๊ตฌ๊ฐ„ํ•ฉ์„ ์บ์‹ฑํ•ด๋‘” ํŠธ๋ฆฌ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ํŠธ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Segment Tree๋Š” Full Binary Tree์ด๊ณ  ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ์™€ ๊ฐ€์žฅ ๊นŠ์ง€ ์•Š์€ ๋…ธ๋“œ์˜ ๊นŠ์ด ์ฐจ์ด๋Š” 1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ €๋Š” tree = [0] * (4 * n)๋กœ 4๋ฐฐํ–ˆ๋Š”๋ฐ ์ด๋Ÿฌ๋ฉด ์—ฌ์œ ๋กœ์šด ๋ฐฐ์—ดํฌ๊ธฐ๋ผ ํ•˜๋„ค์š”(gpt).

์ข€ ๋” ์ •ํ™•ํ•œ size๋ฅผ ์›ํ•œ๋‹ค๋ฉด 2^(h+1) - 1์„ ๊ตฌํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋†’์ด๋Š”
image

๊ตฌ๊ฐ„ํ•ฉ์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ• ๊นŒ์š”? ์ด๊ฑด ์ž˜ ์„ค๋ช…๋œ ๊ธ€์„ ์ฒจ๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹น.. ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์™€ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ž˜ ์„ค๋ช…ํ•ด๋‘์—ˆ๋”๋ผ๊ตฌ์š”.
์—ฌ๊ธฐ ๊ธ€์—์„œ start์™€ end๋Š” node์— ์ €์žฅ๋œ ๊ฐ’์˜ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. (ex. 0~2 ๊ตฌ๊ฐ„ํ•ฉ => start = 0, end = 2) ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋งˆ์„ธ์š” (์ €์ฒ˜๋Ÿผ)

BOJ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

Copy link
Collaborator

@kangrae-jo kangrae-jo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ €๋„ ์ฒ˜์Œ์— ๊ท ํ˜ธ๋‹˜ ๊ฐ™์€ ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ, 3์ดˆ๋™์•ˆ ์ €๋Š” ์ œ๊ฐ€ ์ฒœ์žฌ์ธ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
1 ~ i ์˜ ๊ตฌ๊ฐ„ํ•ฉ์„ ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋†“๋Š” ๋ฐฉ์‹๊ณผ,
๊ฐ’ ๋ณ€๊ฒฝ์„ ๊ฐ ์ธ๋ฑ์Šค์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ์•ˆ๋‚  ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”.

๊ทธ๋ž˜์„œ 20๋ถ„ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์˜ค๊ธฐ๋กœ ๋งˆ์Œ๋จน์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด์—์„œ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์€ ๋„ˆ๋ฌด ์˜ค๋žœ๋งŒ์ด๋ผ ์‚ด์ง ํž˜๋“ค์—ˆ๋„ค์š”.
์ดํ•ด๋Š” ๋˜๋Š”๋ฐ,, ์ฝ”๋“œ ์งœ๊ธฐ๊ฐ€ ์ข€ ํž˜๋“ ,,

๊ทธ์น˜๋งŒ ๋งˆ์ง€๋ง‰์— ๋‚จ๊ฒจ์ฃผ์‹  BOJ ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒ๊ฐ€ ๋งค์šฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋™์ž‘์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•ด์ค˜์„œ ๊ฐ์„ ์ž˜ ์žก์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์˜ˆ ํ’€์ด๋ฒ•์„ ๋ชฐ๋ž์–ด์„œ ๊ทธ๋Ÿฐ๊ฐ€ ๊ฐœ์–ด๋ ค์› ๋„ค์š”.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๋‚˜์˜ค๋ฉด ๋งž์ถฐ๋ณด๋„๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ’€์ด๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
#include <iostream>
#include <vector>

using namespace std;

vector<long long> nums;
vector<long long> tree;

long long makeTree(int start, int end, int node) {
    if (start == end) return tree[node] = nums[start];

    int mid = (start + end) / 2;
    return tree[node] = makeTree(start, mid, node * 2) +
                        makeTree(mid + 1, end, node * 2 + 1);
}

long long solution(int start, int end, int left, int right, int node) {
    if (end < left || right < start) return 0;
    if (left <= start && end <= right) return tree[node];

    int mid = (start + end) / 2;
    return solution(start, mid, left, right, node * 2) +
           solution(mid + 1, end, left, right, node * 2 + 1);
}

void updateTree(int start, int end, int node, int index, long long diff) {
    if (index < start || index > end) return;
    
    tree[node] += diff;
    if (start == end) return;

    int mid = (start + end) / 2;
    updateTree(start, mid, node * 2, index, diff);
    updateTree(mid + 1, end, node * 2 + 1, index, diff);
}

int main() {
    ios_base::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);

    int N, Q;
    cin >> N >> Q;

    nums.assign(N + 1, 0);
    tree.assign(4 * (N + 1), 0);

    for (int i = 1; i <= N; i++) {
        cin >> nums[i];
    }

    makeTree(1, N, 1);

    while (Q--) {
        int x, y, a, b;
        cin >> x >> y >> a >> b;
        if (x > y) swap(x, y);

        cout << solution(1, N, x, y, 1) << '\n';

        long long diff = b - nums[a];
        updateTree(1, N, 1, a, diff);
        nums[a] = b;
    }

    return 0;
}

Copy link
Member

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ „ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๊ฐ€ ์‹ซ์Šต๋‹ˆ๋‹ค ใ…Ž ์–˜๋ž‘ ์ด๊ฑฐ ๋น„์Šทํ•œ ํŽœ์œ… ํŠธ๋ฆฌ ๋“ฑ๋“ฑ๋„...

๊ทธ๋Ÿฐ๋ฐ ๊ธฐ์—… ์ฝ”ํ…Œ์—๋Š” ๋น„์Šทํ•œ ์œ ํ˜•์ด ํ•œ ๋ฒˆ์”ฉ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ๊ฒŒ 2022๋…„ ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ ์ฑ„์šฉ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ 6๋ฒˆ ๋ฌธ์ œ ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ ์ฃ . ๋ฌผ๋ก  ์ถœ๋ ฅ์€ ๋งจ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์“ธ ํ•„์š”๋Š” ์—†์ด ๋ˆ„์ ํ•ฉ์„ ์“ฐ๋ฉด ๋˜์ฃ . ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋ฒ•์„ ์•ˆ๋‹ค๋ฉด ๋ฐ”๋กœ ์“ฑ์“ฑ ์จ๋ฒ„๋ฆฌ๋ฉด ๋˜๊ธด ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ „ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด๋‚˜ ์‹ซ๊ธฐ ๋•Œ๋ฌธ์—, Sqrt Decomposition ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์˜ˆ์ „์— ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๋Œ€ํ‘œ ๋ฌธ์ œ์ธ ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ ์ด๊ฑฐ ํ’€ ๋•Œ ์งฐ๋˜ ์ฝ”๋“œ์ธ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋˜‘๊ฐ™์•„์„œ ๊ทธ๋ƒฅ ๋ณต๋ถ™ ํ–ˆ์Šต๋‹ˆ๋‹ค ใ…Ž... ๋Œ€์‹  ์˜ˆ์ „์— ํ‘ผ ๊ฑด ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ž‘ ์†๋„๊ฐ€ ๋น„์Šทํ–ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ์–˜๊ฐ€ ํ™•์‹คํžˆ ๋А๋ฆฌ๋„ค์š”. ์—ญ์‹œ $\sqrt{N}$์ด log(N)๋ณด๋‹ค ๋А๋ฆด ์ˆ˜ ๋ฐ–์— ์—†๊ตฐ์š”...

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
using int64 = long long;

int main()
{
    cin.tie(nullptr)->sync_with_stdio(false);
    
    int N, Q; cin >> N >> Q;
    vector<int64> Sequence(N);
    for(int64& Num : Sequence) cin >> Num;
     
    int BlockSize = static_cast<int>(ceil(sqrt(N)));
    int BlockCount = static_cast<int>(ceil(N / static_cast<float>(BlockSize)));
    vector<int64> BlockSum(BlockCount, 0);
    for(int i = 0; i < N; ++i)
    {
        BlockSum[i / BlockSize] += Sequence[i];
    }

    while(Q--)
    {
        int64 x, y, a, b; cin >> x >> y >> a >> b;
        if(x > y) swap(x, y);
        --x; --y; --a;
        
        int64 Sum = 0;
        int Begin = x / BlockSize;
        int End = y / BlockSize;
        
        for(int i = Begin; i <= End; ++i)
        {
            Sum += BlockSum[i];
        }
        
        for(int i = Begin * BlockSize; i < x; ++i)
        {
            Sum -= Sequence[i];
        }
        
        for(int i = y + 1; i < min(N, (End + 1) * BlockSize); ++i)
        {
            Sum -= Sequence[i];
        }
        
        cout << Sum << "\n";
        
        int64 Prev = Sequence[a];
        Sequence[a] = b;
        
        int64 Diff = Prev - b;
        BlockSum[a / BlockSize] -= Diff;
    }

    return 0;
}

Copy link
Collaborator

@kokeunho kokeunho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์‹ฌ์ƒ์น˜ ์•Š์€ ์ž…๋ ฅ ๋ฒ”์œ„์— ์†”์งํžˆ ์–ผ๋งˆ ๊ณ ๋ฏผ๋„ ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค ใ…Ž..

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋•๋ถ„์— ๊ณต๋ถ€ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ฒจ๋ถ€ํ•ด์ฃผ์‹  ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ์„ค๋ช… ๋งํฌ๊ฐ€ ์ดํ•ดํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋์Šต๋‹ˆ๋‹ค!
์œ ์ตํ•œ ๋ฌธ์ œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค~

Details

import java.util.*;

public class Main {
    static int N, Q;
    static long[] tree;
    static int size;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        Q = sc.nextInt();

        long[] arr = new long[N+1];
        for (int i = 1; i <= N; i++) {
            arr[i] = sc.nextLong();
        }

        int h = (int)Math.ceil(Math.log(N) / Math.log(2));
        size = 1 << (h+1);
        tree = new long[size];
        init(arr, 1, N, 1);

        for (int i = 0; i < Q; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            int a = sc.nextInt();
            long b = sc.nextLong();

            int left = Math.min(x, y);
            int right = Math.max(x, y);
            
            System.out.println(query(1, N, left, right, 1));
            update(1, N, a, b, 1);
        }
    }
    static void init(long[] arr, int start, int end, int node) {
        if (start == end) {
            tree[node] = arr[start];
        } else {
            init(arr, start, (start+end)/2, 2*node);
            init(arr, (start+end)/2+1, end, 2*node+1);
            tree[node] = tree[2*node] + tree[2*node+1];
        }
    }
    static long query(int start, int end, int left, int right, int node) {
        if (left > end || right < start) return 0;
        if (left <= start && end <= right) return tree[node];
        long lsum = query(start, (start+end)/2, left, right, 2*node);
        long rsum = query((start+end)/2+1, end, left, right, 2*node+1);
        return lsum + rsum;
    }
    static void update(int start, int end, int index, long value, int node) {
        if (index < start || index > end) return;
        if (start == end) {
            tree[node] = value;
            return;
        }
        update(start, (start+end)/2, index, value, 2*node);
        update((start+end)/2+1, end, index, value, 2*node+1);
        tree[node] = tree[2*node] + tree[2*node+1];
    }
}

Copy link
Collaborator

@wnsmir wnsmir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๊ต‰์žฅํ•œ ๋ฌธ์ œ๋„ค์š”
์„ธ๊ทธ๋จผํŠธํŠธ๋ฆฌ๋ผ๋Š”๊ฑธ ์ฒ˜์Œ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์•ˆ๊ทธ๋ž˜๋„ ํŠธ๋ฆฌ๊ฐ€ ์•ฝํ•œ๋ฐ,,
๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ์ €์žฅํ•˜๊ณ , ์ž์‹๋“ค์€ ์ ˆ๋ฐ˜์˜ ํŠธ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ๊ตฌ๊ฐ„ํ•ฉ๋“ค์„ ์ €์žฅํ•ด๋‘๋ฉด
๊ฒฐ๊ตญ ๋ฆฌํ”„๋…ธ๋“œ๋“ค์€ ์ธ๋ฑ์Šค์— ๋งž๊ฒŒ ์ •์ˆ˜๊ฐ€๋ ๊บผ๊ณ ,
๊ตฌ๊ฐ„ํ•ฉ์„ ๊ตฌํ• ๋•Œ๋„, ์ธ๋ฑ์Šค์˜ ์›์†Œ๋ฅผ ๋ฐ”๊ฟ€๋•Œ๋„ ๊ฒฐ๊ตญ ํŠธ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š”๋ฐ ๊นŒ์ง€๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด ์ฆ‰ logN๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ธฐ ๋–„๋ฌธ์— ํ†ต๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€์•Œ๊ณ ๋ฆฌ์ฆ˜ํ•˜๋‚˜ ์•Œ์•„๊ฐ‘๋‹ˆ๋‹ค~

N, Q = map(int, input().split())
arr = list(map(int, input().split()))

size = 1
while size < N:
    size <<= 1

tree = [0] * (2 * size)
for i in range(N):
    tree[size + i] = arr[i]

for i in range(size - 1, 0, -1):
    tree[i] = tree[2 * i] + tree[2 * i + 1]

def range_query(l, r):
    l += size
    r += size
    s = 0
    while l <= r:
        if l & 1:
            s += tree[l]
            l += 1
        if not (r & 1):
            s += tree[r]
            r -= 1
        l //= 2
        r //= 2

    return s

def point_update(pos, val):
    i = size + pos
    tree[i] = val
    i //= 2
    while i:
        tree[i] = tree[2 * i] + tree[2 * i + 1]
        i //= 2

out = []
for _ in range(Q):
    x, y, a, b = map(int, input().split())
    if x > y:
        x, y = y, x
    out.append(str(range_query(x - 1, y - 1)))
    point_update(a - 1, b)

print("\n".join(out))

@wnsmir
Copy link
Collaborator

wnsmir commented Aug 2, 2025

์ „ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๊ฐ€ ์‹ซ์Šต๋‹ˆ๋‹ค ใ…Ž ์–˜๋ž‘ ์ด๊ฑฐ ๋น„์Šทํ•œ ํŽœ์œ… ํŠธ๋ฆฌ ๋“ฑ๋“ฑ๋„...

๊ทธ๋Ÿฐ๋ฐ ๊ธฐ์—… ์ฝ”ํ…Œ์—๋Š” ๋น„์Šทํ•œ ์œ ํ˜•์ด ํ•œ ๋ฒˆ์”ฉ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ๊ฒŒ 2022๋…„ ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ ์ฑ„์šฉ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ 6๋ฒˆ ๋ฌธ์ œ ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ ์ฃ . ๋ฌผ๋ก  ์ถœ๋ ฅ์€ ๋งจ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์“ธ ํ•„์š”๋Š” ์—†์ด ๋ˆ„์ ํ•ฉ์„ ์“ฐ๋ฉด ๋˜์ฃ . ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋ฒ•์„ ์•ˆ๋‹ค๋ฉด ๋ฐ”๋กœ ์“ฑ์“ฑ ์จ๋ฒ„๋ฆฌ๋ฉด ๋˜๊ธด ํ•ฉ๋‹ˆ๋‹ค.

์—ญ์‹œ ๋ชจ๋“ ๋ฌธ์ œ๋ฅผ ์„ญ๋ ตํ•˜์…จ๊ตฐ์š”..
๋ณต์Šต๊ฒธ ๋‚ด์ผ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants