单点修改但是优化,理论上应该不会tle吧
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int maxn=3e5+10;
const int inf=1e9+7;
int n,m,ans,a[maxn],sum[maxn<<2],nxt[maxn],pre[maxn],cnt[maxn];
inline int read() {
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)) {
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch)) s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void pushup(int rt) {
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
inline void build(int rt,int l,int r) {
if(l==r) {
sum[rt]=a[l];
return;
}
int m=(l+r)>>1;
build(rt<<1,l,m);
build(rt<<1|1,m+1,r);
pushup(rt);
}
inline void update(int rt,int l,int r,int x,int c) {
if(l==r) {
sum[rt]=c;
return;
}
int m=(l+r)>>1;
if(m>=x) update(rt<<1,l,m,x,c);
else update(rt<<1|1,m+1,r,x,c);
pushup(rt);
}
inline int query(int rt,int l,int r,int x,int y) {
if(l==r) {
return sum[rt];
}
int m=(l+r)>>1;
int ans=0;
if(x<=m) ans+=query(rt<<1,l,m,x,y);
if(y>m) ans+=query(rt<<1|1,m+1,r,x,y);
return ans;
}
signed main() {
n=read();
for(int i=1;i<=n;++i) a[i]=read();
build(1,1,n);
for(int i=1;i<=n;++i) nxt[i]=i+1,pre[i]=i-1;
m=read();
while(m--) {
int opt=read(),l=read(),r=read();
if(l>r) swap(l,r);
if(opt==1) {
write(query(1,1,n,l,r));
puts("");
}
else {
for(int i=l;i<=r;i=nxt[i]) {
a[i]=(int)sqrt(a[i]);
update(1,1,n,i,a[i]);
cnt[i]++;
if(cnt[i]>=6) {
nxt[pre[i]]=nxt[i];
pre[nxt[i]]=pre[i];
}
}
}
}
return 0;
}