操作1:区间开方
操作2:区间求和
#include <bits/stdc++.h>
#define ll long long
#define mp make_pair
#define pb push_back
#define rep(i,a,b) for(ll i = (a); i <= (b); i++)
#define per(i,a,b) for(ll i = (a); i >= (b); i--)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define pii pair<int,int>
using namespace std;
const int N = 1e5+100;
int n,m;
int bl[N];
ll blo;
ll sum[N],s[N];
bool flag[N];
void solve(int x) { //对整块进行修改操作
if(flag[x]) return ;
flag[x] = 1;
sum[x] = 0;
rep(i, (x-1)*blo+1, x*blo) {
s[i] = sqrt(s[i]);
sum[x] += s[i];
if(s[i]>1) flag[x] = 0;
}
}
void add(ll l,ll r) {
rep(i, l, min(bl[l]*blo,r)) { //左端点所属的半块
sum[bl[l]] -= s[i];
s[i] = sqrt(s[i]);
sum[bl[l]] += s[i];
}
if(bl[l]!=bl[r]) //右端点所属的半块
rep(i, (bl[r]-1)*blo+1, r) {
sum[bl[r]] -= s[i];
s[i] = sqrt(s[i]);
sum[bl[r]] += s[i];
}
rep(i, bl[l]+1, bl[r]-1) solve(i); //整块
}
ll query(ll l,ll r) {
ll ans = 0;
rep(i, l, min(bl[l]*blo,r)) ans += s[i];
if(bl[l]!=bl[r])
rep(i, (bl[r]-1)*blo+1, r) ans += s[i];
rep(i, bl[l]+1, bl[r]-1) ans += sum[i];
return ans;
}
int main() {
freopen("a.txt","r",stdin);
ios::sync_with_stdio(0);
int cnt = 0;
while(cin>>n) {
cout<<"Case #"<<++cnt<<":"<<endl;
memset(sum,0,sizeof(sum));
memset(flag,0,sizeof(flag));
blo = sqrt(n);
rep(i, 1, n) cin>>s[i];
rep(i, 1, n) {
bl[i] = (i-1)/blo + 1;
sum[bl[i]] += s[i];
}
cin>>m;
rep(i, 1, m) {
int oper,l,r;
cin>>oper>>l>>r;
if(l>r) swap(l,r);
if(oper==1) cout<<query(l,r)<<endl;
else add(l,r);
}
cout<<endl;
}
return 0;
}