rt 输出内容和答案在后几位有出入,loj上已通过
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int block[100200];
int a[100055], b[100005], lazy[1005];
int sum[1005];
int L[1005], R[1005], tot = 0;
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]+sqrt(a[i]);
a[i]=sqrt(a[i]);
}
return ;
}
for(int i=l;i<=R[b[l]];i++){
sum[b[i]]=sum[b[i]]-a[i]+sqrt(a[i]);
a[i]=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]+sqrt(a[j]);
a[j]=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]+sqrt(a[i]);
a[i]=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(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int m;
cin>>m;
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;
cin>>opt>>l>>r;
if(l>r)swap(l,r);
if(!opt){
change(l,r,c);
}
else {
cout<<get(l,r,c)<<endl;
}
}
}