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;
const int O = 1e5 + 5;
const int N = (1 << 10) + 5;
const int mod = 1e9 + 7; //998244353;
const int inf = 1e18;
int pr[] = {167772161, 469762049, 754974721, 1045430273, 1051721729, 1053818881};
const int base = 100;
const int K = 17;
int n, q, k, a[K][O], id[O], L[O], R[O];
long long sum[K][O];
void Del(int l){
int block = l / base;
int d = id[block];
for (int i = 0; i < K; ++ i){
int x = i + d >= K ? 0 : sum[i + d][block] - a[i + d][l];
sum[i][block] = x;
}
return;
}
void Add(int l, int r){
int block = l / base;
a[0][l] = r;
for (int i = 0; i < K; ++ i){
if (i) a[i][l] = a[i - 1][l] / k;
sum[i][block] += a[i][l];
}
return;
}
main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> q >> k;
for (int i = 0; i < n; ++ i){
cin >> a[0][i];
int block = i / base;
R[block] = i;
for (int j = 0; j < K; ++ j){
if (j) a[j][i] = a[j - 1][i] / k;
sum[j][block] += a[j][i];
}
}
for (int i = n - 1; i >= 0; -- i){
L[i / base] = i;
}
//cout << L[0] << " " << R[0] << endl;
for (int _ = 1; _ <= q; ++ _){
int t, l, r; cin >> t >> l >> r;
l -= 1; r -= 1;
if (t == 1){
r += 1;
Del(l); Add(l, r); id[l / base] = 0;
}
if (t == 2){
for (int i = (l / base) + 1; i < (r / base); ++ i) id[i] = min(id[i] + 1, K - 1);
for (int _ = l; _ <= min(R[l / base], r); ++ _){
int x = a[id[_ / base]][_] / k;
Del(_); Add(_, x);
}
id[l / base] = 0;
if (l / base != r / base){
for (int _ = L[r / base]; _ <= r; ++ _){
int x = a[id[_ / base]][_] / k;
Del(_); Add(_, x);
}
id[r / base] = 0;
}
}
if (t == 3){
long long res = 0;
for (int i = l / base; i <= r / base; ++ i){
res += sum[id[i]][i];
}
for (int i = L[l / base]; i < l; ++ i) res -= a[id[l / base]][i];
for (int i = r + 1; i <= R[r / base]; ++ i) res -= a[id[r / base]][i];
cout << res << "\n";
}
}
}
/**
1
3
3 1 2
**/
Compilation message (stderr)
sterilizing.cpp:8:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
8 | const int inf = 1e18;
| ^~~~
sterilizing.cpp:38:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
38 | main(){
| ^~~~
# | 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... |