Compy's Blog
318 words
2 minutes
[BOJ] 구간 합 구하기
2026-03-25

구간 합 구하기

TimeLimitMemoryLimitConditionTAG
1s128MB(2 ≤ N ≤ 10,000, 1 ≤ A, B ≤ N, 1 ≤ C ≤ 1,000,000,000)PrefixSum

아니 근데 문제가 세그 트리라는데 제가 세그 트리를 안 써봐가지고 그냥 풀긴 했거든여.. 근데 다들 세그 트리로 풀었다네요

저는 이게 당연히 정해인 줄 알앗는데 ㅠ

그래도 거의 20분 컷 해서 기분은 좋습니다.

포인트는 바뀌는 것을 어떻게 보정해서 더한 값이 같게 만들어질 것인지를 고민하면 풀립니다.

정답 코드
#define MAX 200000001
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <math.h>
using ll = long long;
using namespace std;

ll preSum[1'000'001];
ll nums[1'000'001];

vector<pair<ll, ll>> changes;
ll fixed_[1'000'001];
ll n, m, k;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    cin >> n >> m >> k;
    
    for(int i = 0; i < n; i++){
        cin >> nums[i];
        fixed_[i] = nums[i];
    }
    preSum[0] = nums[0];
    
    for(int i = 1; i < n; i++) preSum[i] += preSum[i-1] + nums[i];
    
    
    
    for(int i = 0; i < m + k; i++){
        ll a, b, c;
        
        cin >> a >> b >> c;
        
        // change
        if(a == 1){
            changes.push_back({b, c - fixed_[b-1]});
            fixed_[b-1] = c;
//            cout << c - numbers[b-1] <<"\n\n";
        }
        // print
        else if(a == 2){
            ll another = 0;
            
            for(pair<ll, ll> p : changes){
                if(!(b <= p.first && p.first <= c)) continue;
                another += p.second;
            }
            
            cout << preSum[c-1] - preSum[b-1] + another + nums[b - 1] << "\n";
        }
        
    }
    return 0;
    
    
    
    

}
[BOJ] 구간 합 구하기
https://compy07.github.io/Blog/posts/boj/2042/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2026-03-25