Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. package pro_tree;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.StringTokenizer;
  7.  
  8. public class BOJ2042 {
  9. static int N;
  10. static int nQuery;
  11.  
  12. static int[] arr;
  13. static long[] treeArr;
  14. public static void main(String[] args) throws IOException {
  15. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  16. StringTokenizer st;
  17.  
  18. st = new StringTokenizer(br.readLine());
  19.  
  20. N = Integer.parseInt(st.nextToken());
  21. nQuery = Integer.parseInt(st.nextToken());
  22. nQuery+= Integer.parseInt(st.nextToken());
  23.  
  24. arr = new int[N]; //값을 받는 리스트
  25.  
  26. for(int i=0; i<N; i++){
  27. arr[i] = Integer.parseInt(br.readLine());
  28. }
  29.  
  30. //// 알고리즘 적용!! /////////
  31.  
  32. //세그먼트 트리 모양 만들기
  33. //트리의 크기를 계산해서 트리를 초기화 해준다.
  34. int x = (int) Math.ceil(Math.log(N)/Math.log(2));
  35. int size = (int)Math.pow(2, x)*2;
  36.  
  37. treeArr = new long[size];
  38.  
  39. //초기값을 셋팅해 주는 메소드
  40. init(arr,0,N-1,1);
  41.  
  42. long result=0;
  43.  
  44. while(nQuery-- > 0){
  45. st = new StringTokenizer(br.readLine());
  46.  
  47. int t = Integer.parseInt(st.nextToken());
  48. int idx1 = Integer.parseInt(st.nextToken());
  49. int idx2 = Integer.parseInt(st.nextToken());
  50.  
  51. if(t == 1){
  52. int diff=idx2 - arr[idx1-1];
  53. arr[idx1-1] = idx2; //arr의 값도 업데이트 해야 한다!!
  54. update(1,0,N-1,idx1-1,diff);
  55. }else{
  56. //result = sum(1,0,N-1,idx1-1,idx2-1);
  57.  
  58. System.out.println(sum(1,0,N-1,idx1-1,idx2-1));
  59. }
  60. }
  61. }
  62.  
  63. /////// 초기화 ////////////
  64. static long init(int[] arr, int start, int end, int node) {
  65. if(start==end){
  66. return treeArr[node] = arr[start];
  67. }
  68. int mid = (start+end)/2;
  69.  
  70. return treeArr[node]=init(arr,start,mid,node*2) + init(arr,mid+1,end,node*2+1);
  71. }
  72.  
  73. //////
  74. static void update(int node, int start, int end, int index, long diff){
  75. if(!(start<=index && end >= index)){
  76. return;
  77. }
  78.  
  79. treeArr[node] += diff;
  80.  
  81. if(start != end){
  82. int mid = (start + end) / 2;
  83. update(node*2, start, mid, index, diff);
  84. update(node*2+1, mid+1, end, index, diff);
  85. }
  86. }
  87. ////////////
  88. static long sum(int node, int start, int end, int left, int right){
  89. if(left > end || right < start){
  90. return 0;
  91. }
  92. if(left <= start && end <= right){
  93. return treeArr[node];
  94. }
  95. int mid=(start+end)/2;
  96. return sum(node*2,start,mid,left,right)+sum(node*2+1,mid+1,end,left,right);
  97. }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement