#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int NR = 1e5 + 5;
long long a[NR], sum[NR << 2];
bool judge[NR << 2];
int cases, n, m;
void pushup(int now)
{
sum[now] = sum[(now << 1)] + sum[(now << 1) + 1];
judge[now] = judge[(now << 1)] && judge[(now << 1) + 1];
return;
}
void build(int now, int l, int r)
{
if (l == r)
{
sum[now] = a[l];
judge[now] = (sum[now] == 0) || (sum[now] == 1);
return;
}
int mid = l + ((r - l) >> 1);
build((now << 1), l, mid);
build((now << 1) + 1, mid + 1, r);
pushup(now);
return;
}
void modify(int now, int l, int r, int a, int b)
{
if(l == r)
{
sum[now] = sqrt(sum[now]);
if(sum[now] == 0 || now[sum] == 1) judge[now] = 1;
return;
}
int mid = l + ((r - l) >> 1);
if(a <= mid && judge[now << 1] == false) modify((now << 1), l, mid, a, b);
if(b > mid && judge[now << 1 | 1] == false) modify((now << 1) + 1, mid + 1, r, a, b);
pushup(now);
}
long long query(int now, int l, int r, int a, int b)
{
if(l > b || r < a) return 0;
if(l >= a && r <= b) return sum[now];
int mid = l + ((r - l) >> 1);
return query(now << 1, l, mid, a, b) + query(now << 1 | 1, mid + 1, r, a, b);
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
build(1, 1, n);
scanf("%d", &m);
for(int i = 1; i <= m; i++)
{
int op, l, r;
scanf("%d %d %d", &op, &l, &r);
if(l > r) swap(l, r);
if(op == 0) modify(1, 1, n, l, r);
else printf("%lld\n", query(1, 1, n, l, r));
}
return 0;
}
很明显,我在 modify 中写了一个 now[sum] == 1 ,但是并未定义一个 now 数组(理论上应该写 sum[now] = 1)结果没有编译错误还过了???!!!
https://www.luogu.com.cn/record/67913890
求问为什么