반응형
2042번: 구간 합 구하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄
www.acmicpc.net
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
Main m = new Main();
m.doit();
}
int N;
int K;
int M;
long [] arr = new long[1000002];
long [] tree = new long[4000002];
public void doit() throws IOException{
// System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String [] inputStr = br.readLine().split(" ");
N = Integer.parseInt(inputStr[0]);
M = Integer.parseInt(inputStr[1]);
K = Integer.parseInt(inputStr[2]);
for(int i = 0; i < N; i++){
arr[i] = Long.parseLong(br.readLine());
}
init(1, 0, N-1);
for(int i = 0; i < M + K; i++){
inputStr = br.readLine().split(" ");
if("1".equals(inputStr[0])){
int t2 = Integer.parseInt(inputStr[1]);
long t3 = Long.parseLong(inputStr[2]);
t2 -= 1;
long diff = t3 - arr[t2];
arr[t2] = t3;
update(1, 0, N-1, t2, diff);
}else{
int t2, t3;
System.out.println(sum(1, 0, N-1, Integer.parseInt(inputStr[1])-1, Integer.parseInt(inputStr[2])-1));
}
}
// printArr(arr, N);
//
// printArr(tree, 2 * N);
br.close();
}
long init(int node, int start, int end){
if(start == end){
return tree[node] = arr[start];
}
else{
return tree[node] = init(node * 2, start, (start+end)/2) + init(node*2+1, (start+end)/2+1, end);
}
}
long sum(int node, int start, int end, int left, int right) {
if (left > end || right < start) {
return 0;
}
if (left <= start && end <= right) {
return tree[node];
}
return sum(node*2, start, (start+end)/2, left, right) + sum(node*2+1, (start+end)/2+1, end, left, right);
}
void update(int node, int start, int end, int index, long diff){
if(index < start || index > end) return;
tree[node] = tree[node] + diff;
if(start != end){
update(node*2, start, (start+end)/2, index, diff);
update(node*2+1, (start+end)/2+1, end, index, diff);
}
}
void printArr(long [] arr, int n){
for(int i = 0; i < n; i++){
System.out.print(arr[i] + ", ");
}
System.out.println();
}
}
반응형
'IT 정보 > 알고리즘(백준, BOJ)' 카테고리의 다른 글
[백준-BOJ] 2156 (0) | 2021.02.03 |
---|---|
[백준-BOJ] 2096 (0) | 2021.02.03 |
[백준-BOJ] 2014 (0) | 2021.02.02 |
[백준-BOJ] 2010 (0) | 2021.02.02 |
[백준-BOJ] 1978 (0) | 2021.02.02 |