백준공부/java

[백준] 2042번 구간 합 구하기 (gold 1

gomduri43 2024. 5. 27. 21:14

import java.io.*;
import java.util.*;

class SegTree{

    long[] tree;

    public SegTree(int n) {
        int height = (int) Math.ceil(Math.log(n) / Math.log(2));
        int treeSize =(int)Math.pow(2,height+1);
        tree = new long[treeSize];
    }

    public long init(int node, long[] arr, int start, int end){
        if(start==end){
            return tree[node]=arr[start];
        }
        else{
            return tree[node]=init(node*2, arr, start, (start+end)/2)+
                    init(node*2+1, arr, (start+end)/2+1, end);
        }
    }

    public void update(int node, int start, int end, int index, long diff){
        if(index<start || end<index){
            return;
        }

        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);
        }
    }

    public long sum(int node, int start, int end, int left, int right){
        if(right<start || end<left){
            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);
    }
}

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st=new StringTokenizer(br.readLine());

        int n=Integer.valueOf(st.nextToken());
        int m=Integer.valueOf(st.nextToken());
        int k=Integer.valueOf(st.nextToken());

        //수 저장할 배열
        long[] arr=new long[n+1];
        for(int i=1; i<=n; i++){
            arr[i]=Long.valueOf(br.readLine());
        }

        SegTree seg=new SegTree(n);
        seg.init(1,arr,1,n);

        //쿼리 진행하기.
        for(int i=1; i<=k+m; i++){
            st=new StringTokenizer(br.readLine());
            //변형 쿼리
            if(Integer.valueOf(st.nextToken())==1){
                int b=Integer.valueOf(st.nextToken());
                long c=Long.valueOf(st.nextToken());
                seg.update(1,1,n,b,c-arr[b]);
                //해당 지점에 또다시 변경이 일어날 수 있으므로 값을 바꾸어 주어야 함.
                arr[b]=c;
            }
            //구간합 쿼리
            else{
                int b=Integer.valueOf(st.nextToken());
                int c=Integer.valueOf(st.nextToken());
                bw.write(seg.sum(1,1,n,b,c)+"\n");
            }
        }
        bw.flush();
    }
}