This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,k,t,x,y,a[100005],tree[400005];
void build(int id,int l,int r){
	if(l==r){
		tree[id]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	tree[id]=tree[id*2]+tree[id*2+1];
}
void update1(int id,int l,int r,int pos,int val){
	if(l==r){
		tree[id]=val;
		return;
	}
	int mid=(l+r)/2;
	if(pos<=mid) update1(id*2,l,mid,pos,val);
	else update1(id*2+1,mid+1,r,pos,val);
	tree[id]=tree[id*2]+tree[id*2+1];
}
void update2(int id,int l,int r,int u,int v){
	if(tree[id]==0||k==1) return;
	if(l==r){
		tree[id]/=k;
		return;
	}
	int mid=(l+r)/2;
	if(u<=mid) update2(id*2,l,mid,u,v);
	if(mid<v) update2(id*2+1,mid+1,r,u,v);
	tree[id]=tree[id*2]+tree[id*2+1];
}
int getsum(int id,int l,int r,int u,int v){
	if(v<l||u>r||u>v) return 0;
	if(u<=l&&r<=v){
		return tree[id];
	}
	int mid=(l+r)/2,ans=0;
	if(u<=mid) ans+=getsum(id*2,l,mid,u,v);
	if(mid<v) ans+=getsum(id*2+1,mid+1,r,u,v);
	return ans;
}
signed main(){
	scanf("%lld %lld %lld",&n,&q,&k);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	while(q--){
		scanf("%lld %lld %lld",&t,&x,&y);
		if(t==1){
			update1(1,1,n,x,y);
		}if(t==2){
			update2(1,1,n,x,y);
		}if(t==3){
			printf("%lld\n",getsum(1,1,n,x,y));
		}
	}
}
Compilation message (stderr)
sterilizing.cpp: In function 'int main()':
sterilizing.cpp:47:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld %lld %lld",&n,&q,&k);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:49:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld",&a[i]);
   ~~~~~^~~~~~~~~~~~~~
sterilizing.cpp:53:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld %lld %lld",&t,&x,&y);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |