LOJ 上对应的题是 6281. 虽然我知道 LOJ 的数据比这个弱得多,but still.
数组已经开大了。
RE 似乎出现在 a[j] = sqrt(a[j]); 这里。
#include <iostream>
#include <cmath>
using namespace std;
long long a[100005], summ[100005]; bool flag[100005];
int main() {
long long n, bl=200, opt, l, r, c, ans=0, m; cin >> n;
for (int i=1; i<=n; i++) {cin >> a[i]; summ[(i-1)/bl] += a[i];} cin >> m;
for (int i=1; i<=m; i++) {
cin >> opt >> l >> r;
if (opt) {
ans = 0;
for (int j=(l-1)/bl+1; j<=(r-1)/bl-1; j++) ans += summ[j];
for (int j=l; (j-1)/bl == (l-1)/bl && j <= r; j++) ans += a[j];
for (int j=r; (j-1)/bl == (r-1)/bl && (l-1)/bl != (r-1)/bl; j--) ans += a[j];
cout << ans << endl;
continue;
}
for (int j=(l-1)/bl+1; j<=(r-1)/bl-1; j++) {
if (flag[j]) continue;
flag[j] = true;
for (int k=j*bl+1; j == (k-1)/bl; k++) {
summ[j] -= a[k]; a[k] = sqrt(a[k]); summ[j] += a[k];
flag[j] &= (a[k] <= 1);
}
}
for (int j=l; (j-1)/bl == (l-1)/bl && j <= r; j++) {
summ[(j-1)/bl] -= a[j]; a[j] = sqrt(a[j]); summ[(j-1)/bl] += a[j];
}
for (int j=r; (j-1)/bl == (r-1)/bl && (l-1)/bl != (r-1)/bl; j--) {
summ[(j-1)/bl] -= a[j]; a[j] = sqrt(a[j]); summ[(j-1)/bl] += a[j];
}
}
return 0;
}