#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector <int> niz;
vector <int> st;
int k;
void build (int node, int l, int r)
{
if(l==r) st[node]=niz[l];
else
{
int mid=(l+r)/2;
build(2*node, l, mid); build(2*node+1, mid+1, r);
st[node]=st[2*node]+st[2*node+1];
}
}
void upd1(int node, int l, int r, int ind, int val)
{
if(l==r)
{
st[node]=+val; niz[ind]+=val;
}
else
{
int mid=(l+r)/2;
if(ind<=mid) upd1(2*node, l, mid, ind, val);
else upd1(2*node+1, mid+1, r, ind, val);
st[node]=st[2*node]+st[2*node+1];
}
}
void upd2 (int node, int l, int r, int ql, int qr)
{
if (st[node]==0 || r<ql || l>qr) return;
if (l==r)
{
st[node]=st[node]/k; niz[l]=niz[l]/k;
}
else
{
int mid=(l+r)/2;
upd2(2*node, l, mid, ql, qr);
upd2(2*node+1, mid+1, r, ql, qr);
st[node]=st[2*node]+st[2*node+1];
}
}
int query (int node, int l, int r, int ql, int qr)
{
if(r<ql || l>qr) return 0;
if(ql<=l && r<=qr) return st[node];
int mid=(l+r)/2;
return query(2*node, l, mid, ql, qr)+query(2*node+1, mid+1, r, ql, qr);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n, q; cin>>n>>q>>k;
niz.resize(n);
for (int i=0; i<n; i++) cin>>niz[i];
st.resize(4*n);
build(1, 0, n-1);
while (q--)
{
int op; cin>>op;
int l, r; cin>>l>>r;
l--; r--;
if (op==1)
{
r++;
upd1(1, 0, n-1, l, r);
}
else if (op==2)
{
if (k!=1) upd2(1, 0, n-1, l, r-niz[l]);
}
else
{
cout<<query(1, 0, n-1, l, r)<<endl;
}
}
return 0;
}
# | 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... |