제출 #418025

#제출 시각아이디문제언어결과실행 시간메모리
418025MohamedAhmed04Sterilizing Spray (JOI15_sterilizing)C++14
100 / 100
2291 ms10384 KiB
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 1e5 + 10 ;

int arr[MAX] ;
int n , q , k ;

long long tree[4 * MAX] ;

void update(int node , int l , int r , int idx , int val)
{
	if(idx > r || idx < l)
		return ;
	if(l == r)
	{
		tree[node] = val ;
		return ;
	}
	int mid = (l + r) >> 1 ;
	update(node << 1 , l , mid , idx , val) ;
	update(node << 1 | 1 , mid+1 , r , idx , val) ;
	tree[node] = tree[node << 1] + tree[node << 1 | 1] ;
}

long long query(int node , int l , int r , int from , int to)
{
	if(from > r || to < l)
		return 0 ;
	if(l >= from && r <= to)
		return tree[node] ;
	int mid = (l + r) >> 1 ;
	long long x = query(node << 1 , l , mid , from , to) ;
	long long y = query(node << 1 | 1 , mid+1 , r , from , to) ;
	return (x + y) ;
}

set<int>s ;

void upd(int l , int r)
{
	if(k == 1)
		return ;
	int cur = l-1 ;
	while(s.size())
	{
		auto it = s.upper_bound(cur) ;
		if(it == s.end())
			break ;
		cur = *it ;
		if(cur > r)
			return ;
		s.erase(cur) ;
		arr[cur] /= k ;
		update(1 , 1 , n , cur , arr[cur]) ;
		if(arr[cur])
			s.insert(cur) ;
	}
}

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>q>>k ;
	for(int i = 1 ; i <= n ; ++i)
		cin>>arr[i] ;
	for(int i = 1 ; i <= n ; ++i)
	{
		update(1 , 1 , n , i , arr[i]) ;
		if(arr[i])
			s.insert(i) ;
	}
	while(q--)
	{
		int t ;
		cin>>t ;
		if(t == 1)
		{
			int idx , x ;
			cin>>idx>>x ;
			if(arr[idx])
				s.erase(idx) ;
			arr[idx] = x ;
			update(1 , 1 , n , idx , arr[idx]) ;
			if(arr[idx])
				s.insert(idx) ;
		}
		else if(t == 2)
		{
			int l , r ;
			cin>>l>>r ;
			upd(l , r) ;
		}
		else if(t == 3)
		{
			int l , r ;
			cin>>l>>r ;
			cout<<query(1 , 1 , n , l , r)<<"\n" ;
		}
	}
	return 0 ;
}		
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...