์ธ๋ฑ์Šค ํŠธ๋ฆฌ

2042๋ฒˆ: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ (acmicpc.net)

 

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

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

www.acmicpc.net

#if 01

#include <iostream>
#include <string.h>

using namespace std;

long long arr[1000001], tree[1000001];
int n, m, k;	// ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜, ๋ณ€๊ฒฝ ํšŸ์ˆ˜, ๊ตฌ๊ฐ„ํ•ฉ ๊ณ„์‚ฐ ํšŸ์ˆ˜


// i๋ฒˆ์งธ ์ˆ˜๊นŒ์ง€์˜ ๋ˆ„์  ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
// 0์ด ์•„๋‹Œ ๋งˆ์ง€๋ง‰ ๋น„ํŠธ๋งŒํผ ๋นผ๋ฉด์„œ ๊ตฌ๊ฐ„๋“ค์˜ ๊ฐ’์˜ ํ•ฉ ๊ณ„์‚ฐ
long long prefixSum(int i) {
	long long result = 0;
	while (i > 0) {
		result += tree[i];
		i -= (i & -i);
	}
	return result;
}

// i๋ฒˆ์งธ ์ˆ˜๋ฅผ dif๋งŒํผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜
// 0์ด ์•„๋‹Œ ๋งˆ์ง€๋ง‰ ๋น„ํŠธ๋งŒํผ ๋”ํ•˜๋ฉด์„œ ๊ตฌ๊ฐ„๋“ค์˜ ๊ฐ’ ๋ณ€๊ฒฝ
void update(int i, long long dif) {
	while (i <= n) {
		tree[i] += dif;
		i += (i & -i);
	}
}

long long intervalSum(int start, int end) {
	return prefixSum(end) - prefixSum(start - 1);
}


int main(void) {
	memset(tree, 0, sizeof(tree));

	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++) {
		long long x;
		cin >> x;
		arr[i] = x;
		update(i, x);
	}

	int cnt = 0;
	while (cnt++ < m + k) {
		int op;
		cin >> op;
		if (op == 1) {
			int index;
			long long value;
			cin >> index >> value;
			update(index, value - arr[index]);
			arr[index] = value;
		}
		else {
			int start, end;
			cin >> start >> end;
			cout << intervalSum(start, end);
		}
	}
}


# endif