https://www.acmicpc.net/problem/18436

요즘 계속 회사 일이 바빠기도 했고 집에서 조금 쉬다보니 공부를 못했던것 같습니다.

오랜만에 푸는거라 시간이 조금 많이 걸렸네요 ㅠ

 

package test01;
import java.util.*;
import java.io.*;
public class Main {
	public static int n;
	public static int m;
	public static int k;
	public static long tree[];
	

	public static long buildingTree(int start ,int end, int node, long arr[]){
	
		if(start==end){
			if(arr[start]%2==0) {
				return tree[node]=1;
			}else {
				return  tree[node]=0;
			}
			
		}

		int mid=(start+end)/2; // 0+5 =2

		return tree[node]=buildingTree(start, mid,node*2,arr)+buildingTree(mid+1,end,node*2+1,arr);
		
	}

	public static long updateTree(int start,int end,int node,long newValue, int findIndex){
	
		if(findIndex<start||findIndex>end){
			return tree[node];
		}
		

		if(start==end){
			if(newValue % 2 == 0) {
				return tree[node] = 1;
			} else {
				return tree[node] = 0;
			}
		}
		
		

		int mid=(start+end)/2;

		return tree[node]=updateTree(start,mid,node*2,newValue,findIndex)+updateTree(mid+1,end,node*2+1,newValue,findIndex);
		

	}

	public static long select (int start,int end,int node,int left,int right){
	
		if(left>end||right<start){
			return 0;
		}
		

		if(left<=start&&end<=right){
			return tree[node];
		}
		
		int mid=(start+end)/2;

		return select(start,mid,node*2,left,right)+select(mid+1,end,node*2+1,left,right);
		

	}

	public static void main(String[] args) throws Exception {
		Scanner scan = new Scanner(System.in);
		 n =scan.nextInt();
		 long arr[]=new long[n];
		 for(int t=0;t<n;t++){
				long tmp=scan.nextLong();
				arr[t]=tmp;
		}
		 
		 m=scan.nextInt();
	
		tree=new long[n*4];
		
		buildingTree(0,n-1,1,arr);
	
		for(int t=0;t<m;t++){
			int a=scan.nextInt();
			int b = scan.nextInt();
			int c = scan.nextInt();
			if(a==1){
				//update
				if(arr[ b-1 ] %2 ==1 && c%2==0 ) {
					updateTree(0,n-1,1, c , b-1);
				}else if(arr[  (b-1) ] %2 ==0 && c%2==1 ){
					updateTree(0,n-1,1 ,c, b-1);
				}
				arr[b-1]=c;
				
			}else if(a == 2){
				// select
				long query = select(0, n - 1, 1, b - 1, c - 1);
				System.out.println(query);
			} else if(a == 3){
				// select
				long query = select(0, n - 1, 1, b - 1, c - 1);
				System.out.println((c - b + 1) - query);
			}
		}
	

	}
}

'알고리즘 공부' 카테고리의 다른 글

백준 - 구간 합 구하기2  (0) 2024.07.17
백준 커피숍2  (0) 2024.04.17
백준 가계부  (0) 2024.04.10
백준 쵯소값과 최댓값  (0) 2024.04.08
백준 구간 합 구하기  (0) 2024.04.04

+ Recent posts