#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define ll long long
using namespace std;
inline long long read()
{
int f=1,s=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*f;
}
const int N=1e5+5;
ll x,y,z;
ll n,m,s[N],maxx[N<<2],sum[N<<2];
void build(ll k,ll l,ll r){
if(l==r){
sum[k]=maxx[k]=s[l];
return;
}
ll mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
void updata(ll k,ll l,ll r,ll x,ll y){
if(l==r && l>=x && r<=y){
if(maxx[k]!=1&&maxx[k]!=0) sum[k]=maxx[k]=sqrt(sum[k]);//如果当前区间内最大的是1那么必然全是1或0 所以就不开方了
return;
}
ll mid=l+r>>1;
if(x<=mid) updata(k<<1,l,mid,x,y);
if(mid+1<=y) updata(k<<1|1,mid+1,r,x,y);
maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
ll query(ll k,ll l,ll r,ll x,ll y){
if(l==r && l>=x && r<=y) return sum[k];
ll mid=l+r>>1,res=0;
if(x<=mid) res+=query(k<<1,l,mid,x,y);
if(mid+1<=y) res+=query(k<<1|1,mid+1,r,x,y);
return res;
}
int main(){
n=read();
for(int i=1;i<=n;i++) s[i]=read();
build(1,1,n);
m=read();
while(m-->0){
z=read();x=read();y=read();
if(x>=y) swap(x,y);
if(z==1) printf("%d\n",query(1,1,n,x,y));
else updata(1,1,n,x,y);
}
return 0;
}
说句闲话,此题暴力修改是正解了吧,根号没有和并性