WA on 6~10,已经 #define int long long 了
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 100005, maxm = 1005;
int l[maxm], r[maxm], maxx[maxm], sum[maxm];
int pos[maxn], a[maxn];
int n, m, k, kc;
void update(int p) {
int mp = 0, sp = 0;
for (int i = l[p]; i <= r[p]; i++)
mp = max(mp, a[i]),
sp += a[i];
maxx[p] = mp, sum[p] = sp;
}
void modify(int L, int R) {
int p = pos[L], q = pos[R];
if (p == q) {
if (maxx[p] == 1) return ;
for (int i = L; i <= R; i++)
a[i] = sqrt(a[i]);
update(p); return ;
}
for (int i = p + 1; i < q; i++)
if (maxx[i] > 1) {
for (int j = l[i]; j <= r[i]; j++)
a[j] = sqrt(a[j]);
update(i);
}
if (maxx[p] > 1) {
for (int i = L; i <= r[p]; i++)
a[i] = sqrt(a[i]);
update(p);
}
if (maxx[q] > 1) {
for (int i = l[q]; i <= R; i++)
a[i] = sqrt(a[i]);
update(q);
}
}
int query(int L, int R) {
int p = pos[L], q = pos[R];
if (p == q) {
int res = 0;
for (int i = L; i <= R; i++)
res += a[i];
return res;
}
int res = 0;
for (int i = p + 1; i < q; i++) res += sum[i];
for (int i = L; i <= r[p]; i++) res += a[i];
for (int i = l[q]; i <= R; i++) res += a[i];
return res;
}
signed main() {
scanf("%lld", &n);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
k = sqrt(n), kc = n / k;
for (int i = 1; i <= k; i++)
l[i] = (i - 1) * kc + 1,
r[i] = i * kc;
if (r[k] < n) ++k, l[k] = r[k - 1] + 1, r[k] = n;
for (int i = 1; i <= k; i++)
for (int j = l[i]; j <= r[i]; j++)
pos[j] = i,
maxx[i] = max(maxx[i], a[j]),
sum[i] += a[j];
scanf("%lld", &m);
while (m--) {
int opt, l, r;
scanf("%lld%lld%lld", &opt, &l, &r);
if (!opt) modify(l, r);
else printf("%lld\n", query(l, r));
}
return 0;
}
感觉代码可读性还是不错的(雾)