๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #2042 ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

by dar0m! 2021. 2. 15.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 2 ์ดˆ 256 MB 23.830 %
 

2042๋ฒˆ: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000,000)๊ณผ M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. M์€ ์ˆ˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ํšŸ์ˆ˜์ด๊ณ , K๋Š” ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํšŸ์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„

www.acmicpc.net

 

๋ฌธ์ œ

 

ํ•ด๊ฒฐ

key point, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ

2021/02/15 - [๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ] - [BOJ] #10868 ์ตœ์†Ÿ๊ฐ’

2021/02/15 - [๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ] - [BOJ] #11505 ๊ตฌ๊ฐ„ ๊ณฑ ๊ตฌํ•˜๊ธฐ

  • ์œ„์˜ ๋‘ ๋ฌธ์ œ์™€ ๋ฐฉ์‹์€ ๋™์ผํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ ๊ตฌ๊ฐ„ ๊ณฑ ๊ตฌํ•˜๊ธฐ ๋ฌธ์ œ์™€ ์ข€ ๋” ์œ ์‚ฌํ•˜๋ฉฐ
  • ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๊ฐ€ long long ๋ฒ”์œ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ถ€ long long ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ๋งŒ '๋งž์•˜์Šต๋‹ˆ๋‹ค.'๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
 17616 KB 268 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long int ll;
int n, m, k, h = 1;
vector<ll> seg;
void update(ll i, ll num) {
    i += h - 1;
    seg[i] = num;
    while (i > 1) {
        i /= 2;
        seg[i] = seg[i * 2+ seg[i * 2 + 1];
    }
}
// l, r ์ฐพ๋Š” ๋ฒ”์œ„, num ํ˜„์žฌ ๋…ธ๋“œ ๋ฒˆํ˜ธ, nl, nr ํ˜„์žฌ ๋ฒ”์œ„
ll query(ll l, ll r, ll num, ll nl, ll nr) {
    if (l <= nl && nr <= r) return seg[num];
    if (nl > r || nr < l) return 0;
 
    int mid = (nl + nr) / 2;
    return query(l, r, num * 2, nl, mid) + query(l, r, num * 2 + 1, mid + 1, nr);
}
 
int main() {
    scanf("%d%d%d"&n, &m, &k);
    while (h < n) h <<= 1;
    seg.resize(h * 2);
    ll a, b, c;
    for (int i = 0; i < n; i++) {
        scanf("%lld"&a);
        update(i + 1, a);
    }
    for (int i = 0; i < m + k; i++) {
        scanf("%lld%lld%lld"&a, &b, &c);
        if (a == 1) update(b, c);
        else printf("%lld\n", query(b, c, 11, h));
    }
    return 0;
}
cs

๋Œ“๊ธ€