#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
struct bttree
{
int l, r;
ll sum;
} t[N << 2];
int ls(int p){ return p << 1; }
int rs(int p) { return p << 1 | 1; }
ll a[N];
void build(int p, int l, int r)
{
t[p] = { l ,r, 0 };
if (l == r)
{
t[p].sum = a[l];
return;
}
int mid = (l + r) >> 1;
if (l <= mid) build(ls(p), l, mid);
if (r > mid) build(rs(p), mid + 1, r);
t[p].sum = t[ls(p)].sum + t[rs(p)].sum;
}
void update(int p, int l, int r)
{
if (l <= t[p].l && r >= t[p].r && (t[p].sum == (t[p].r - t[p].l + 1))) return;
if (t[p].l == t[p].r)
{
t[p].sum = sqrt(t[p].sum);
return;
}
if (l <= t[ls(p)].r) update(ls(p), l, r);
if (r > t[ls(p)].r) update(rs(p), l, r);
t[p].sum = t[ls(p)].sum + t[rs(p)].sum;
}
ll query(int p, int l, int r)
{
if (l <= t[p].l && r >= t[p].r) return t[p].sum;
ll ans = 0;
if (l <= t[ls(p)].r) ans += query(ls(p), l, r);
if (r > t[ls(p)].r) ans += query(rs(p), l, r);
return ans;
}
int main()
{
int n, j = 0;
while (scanf("%d", &n) != EOF)
{
j++;
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
build(1, 1, n);
printf("Case #%d:\n", j);
int m;
scanf("%d", &m);
while (m--)
{
int op;
scanf("%d", &op);
int x, y;
scanf("%d %d", &x, &y);
if (x > y) swap(x, y);
if (op)
{
printf("%lld\n", query(1, x, y));
}
else
{
update(1, x, y);
}
}
}
return 0;
}
hdu4027
最新推荐文章于 2024-07-13 13:36:16 发布