Rt,loj和洛谷上的同题已通过
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int block[200200];
int a[200055], b[200005], lazy[2005];
int sum[1005];
int L[2005], R[2005], tot = 0;
int cnt;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0)putchar('-');
if(x>10)print(x/10);
putchar(x%10^48);
}
void change(int l,int r,int c){
if(b[l]==b[r]){
for(int i=l;i<=r;i++){
sum[b[i]]=sum[b[i]]-a[i]+(int)sqrt(a[i]);
a[i]=(int)sqrt(a[i]);
}
return ;
}
for(int i=l;i<=R[b[l]];i++){
sum[b[i]]=sum[b[i]]-a[i]+(int)sqrt(a[i]);
a[i]=(int)sqrt(a[i]);
}
for(int i=b[l]+1;i<=b[r]-1;i++){
if(!lazy[i]){
int ssr=0;
for(int j=L[i];j<=R[i];j++){
sum[i]=sum[i]-a[j]+(int)sqrt(a[j]);
a[j]=(int)sqrt(a[j]);
if(a[j]>1)ssr=1;
}
if(!ssr)lazy[i]=1;
}
}
for(int i=L[b[r]];i<=r;i++){
sum[b[i]]=sum[b[i]]-a[i]+(int)sqrt(a[i]);
a[i]=(int)sqrt(a[i]);
}
}
int get(int l,int r,int c){
int ans=0;
if(b[l]==b[r]){
for(int i=l;i<=r;i++){
ans+=a[i];
}
return ans;
}
for(int i=b[l]+1;i<b[r];i++){
ans+=sum[i];
}
for(int i=l;i<=R[b[l]];i++){
ans+=a[i];
}
for(int i=L[b[r]];i<=r;i++){
ans+=a[i];
}
return ans;
}
signed main(){
while(~scanf("%lld",&n)){
// if()
cout<<"Case #"<<++cnt<<":"<<endl;
for(int i=1;i<=n;i++){
a[i]=read();
}
int m;
m=read();
tot=sqrt(n);
for(int i=1;i<=tot;i++){
L[i]=(i-1)*tot+1;
R[i]=i*tot;
}
if(R[tot]<n){
tot++;
R[tot]=n;
L[tot]=R[tot-1]+1;
}
for(int i=1;i<=tot;i++){
for(int j=L[i];j<=R[i];j++){
b[j]=i;
sum[i]+=a[j];
}
}
for(int i=1;i<=m;i++){
int opt,l,r,c=0;
opt=read(),l=read(),r=read();
if(l>r)swap(l,r);
if(!opt){
change(l,r,c);
}
else {
print(get(l,r,c)),puts("");
}
}
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
tot=0;
printf("\n");
}
}