Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9d44cf4

Browse files
authored
Update 3.cpp
1 parent96fbadd commit9d44cf4

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

‎21/3.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include<bits/stdc++.h>
2+
3+
usingnamespacestd;
4+
5+
// 전체 데이터의 개수는 최대 1,000,000개
6+
longlong arr[1000001], tree[1000001];
7+
// 데이터의 개수(n), 변경 횟수(m), 구간 합 계산 횟수(k)
8+
int n, m, k;
9+
10+
// i번째 수까지의 누적 합을 계산하는 함수
11+
longlongprefixSum(int i) {
12+
longlong result =0;
13+
while(i >0) {
14+
result += tree[i];
15+
// 0이 아닌 마지막 비트만큼 빼가면서 이동
16+
i -= (i & -i);
17+
}
18+
return result;
19+
}
20+
21+
// i번째 수를 dif만큼 더하는 함수
22+
voidupdate(int i,longlong dif) {
23+
while(i <= n) {
24+
tree[i] += dif;
25+
i += (i & -i);
26+
}
27+
}
28+
29+
// start부터 end까지의 구간 합을 계산하는 함수
30+
longlongintervalSum(int start,int end) {
31+
returnprefixSum(end) -prefixSum(start -1);
32+
}
33+
34+
intmain(void) {
35+
scanf("%d %d %d", &n, &m, &k);
36+
for(int i =1; i <= n; i++) {
37+
longlong x;
38+
scanf("%lld", &x);
39+
arr[i] = x;
40+
update(i, x);
41+
}
42+
int count =0;
43+
while(count++ < m + k) {
44+
int op;
45+
scanf("%d", &op);
46+
// 업데이트(update) 연산인 경우
47+
if(op ==1) {
48+
int index;
49+
longlong value;
50+
scanf("%d %lld", &index, &value);
51+
update(index, value - arr[index]);// 바뀐 크기(dif)만큼 적용
52+
arr[index] = value;// i번째 수를 value로 업데이트
53+
}
54+
// 구간 합(interval sum) 연산인 경우
55+
else {
56+
int start, end;
57+
scanf("%d %d", &start, &end);
58+
printf("%lld\n",intervalSum(start, end));
59+
}
60+
}
61+
return0;
62+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp