#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef __int64 LL;
const int maxn = 100010;
LL sum[maxn<<2];
void build(int l, int r, int rt)
{
if (l == r)
{
scanf("%I64d", &sum[rt]);
return ;
}
int m = (l + r) >> 1;
build(l, m, rt << 1);
build(m + 1, r, rt << 1 | 1);
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void update(int L, int R, int l, int r, int rt)
{
if (sum[rt] <= r - l + 1)
return ;
if (l == r)
{
sum[rt] = (LL)sqrt((double)sum[rt]);
return ;
}
int m = (l + r) >> 1;
if (L <= m) update(L, R, l, m, rt << 1);
if (R > m) update(L, R, m + 1, r, rt << 1 | 1);
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
LL query(int L, int R, int l, int r, int rt)
{
if (L <= l && R >= r)
{
if (sum[rt] <= r - l + 1 || l == r)
return sum[rt];
}
int m = (l + r) >> 1;
LL ans = 0;
if (L <= m) ans += query(L, R, l, m, rt << 1);
if (R > m) ans += query(L, R, m + 1, r, rt << 1 | 1);
return ans;
}
int main()
{
int n, m, t, x, y;
int cas = 0;
while (scanf("%d", &n) != EOF)
{
cas++;
printf("Case #%d:\n", cas);
build(1, n, 1);
scanf("%d", &m);
while (m--)
{
scanf("%d %d %d", &t, &x, &y);
if (x > y) swap(x, y);
if (t == 0)
update(x, y, 1, n, 1);
else
printf("%I64d\n", query(x, y, 1, n, 1));
}
printf("\n");
}
return 0;
}