study/백준

[백준문제풀이] 2042 구간 합 구하기 java 풀이

SHplusR 2023. 8. 20. 16:16

접근법 : 

**1) 어떻게 풀 것인가?**

인덱스드 트리의 기본적 문제이다.

문제에서 '구간합을 구해라' 라고 말한다. 

 

**2) 시간복잡도**

2초다.

인덱스드 트리를 사용하면 높이가 log(n) 이 되므로 위 과정은 

k 최댓값 10,000

n 최댓값 10^6

10,000(k) * log(10^6)으로, 180,000 정도되니 ㄱㅊ다.

 

**3) 공간복잡도**

256mb이다. 

입력으로 주어지는 모든 수는 -2^63보다 크거나 같고, 2^63-1보다 작거나 같은 정수이다.

라고 문제에서 나와있으므로 long을 가지는 몇가지만 조심한다.

 

**4) 풀면서 놓쳤던점**

 

**5) 이 문제를 통해 얻어갈 것**

인덱스드트리의 기초!

 

import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {
    	
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringBuilder sb = new StringBuilder();
    	String[] strings = br.readLine().split(" ");
    	int n = Integer.valueOf(strings[0]);
    	int m = Integer.valueOf(strings[1]);
    	int k = Integer.valueOf(strings[2]);
    	int offset = 1;
    	
		for(offset =1; offset<n; offset *=2) {
		}
		long[]idxtree = new long[offset*2+2]; 
		
    	for(int i=0; i<n; i++) {
    		idxtree[offset+i] = Long.parseLong(br.readLine());
    	}
    	
    	for(int i=offset-1; i>=1; i--) {
    		idxtree[i] = idxtree[i*2] + idxtree[i*2+1];
    	}
    	
    	for(int i =0; i<m+k; i++) {
    		String[] strarr = br.readLine().split(" ");
    		int a = Integer.valueOf(strarr[0]);
    		int b = Integer.valueOf(strarr[1]);
    		long c = Long.valueOf(strarr[2]);
    		if(a == 1) {
    			int x = (int)(offset+b-1);
    			idxtree[x] = c;
    			while(x>1) {
    				x /=2;
    				idxtree[x] = idxtree[x*2] + idxtree[x*2+1];
    			}
    		}
    		else {
    			int l = (int)b+offset-1;
    			int r = (int)c+offset-1;
    			long ret = 0;
    			while(l <=r) {
    				if((l&1) == 1) {ret+= idxtree[l++];}
    				if((r&1) == 0) {ret+= idxtree[r--];}
    				l /=2;
    				r /=2;
    			}
    			sb.append(ret+"\n");
    		}
    	}
    	System.out.println(sb);
    }
}