
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100010;
int n,m;
int a[N],seg[N << 2],tag[N << 2],st[N << 2];
int b[N][7];
void pushdown(int u)
{
tag[u*2]=tag[u];tag[u*2+1]=tag[u];
st[u*2]+=tag[u];st[u*2+1]+=tag[u];
tag[u]=0;
}
void pushup(int u)
{
st[u]=min(st[u*2],st[u*2+1]);
seg[u]=seg[u*2]+seg[u*2+1];
}
void build_tree(int l,int r,int u)
{
if(l==r)
{
seg[u]=a[l];
return;
}
int mid=(l+r)/2;
build_tree(l,mid,u*2);build_tree(mid+1,r,u*2+1);
seg[u]=seg[u*2]+seg[u*2+1];
}
void update(int l,int r,int x,int y,int u)
{
if(l>=x && r<=y && st[u]>=6) return;
if(l==r)
{
int t=(int)sqrt((double)seg[u]);
seg[u]=t;
return;
}
pushdown(u);
int mid=(l+r)/2;
if(mid>=x && l<=y) update(l,mid,x,y,u*2);
if(r>=x && mid+1<=y) update(mid+1,r,x,y,u*2+1);
pushup(u);
}
void segst(int l,int r,int x,int y,int u)
{
if(l>=x && r<=y && st[u]>=6) return;
if(l==r)
{
st[u]++;
return;
}
if(l==r) return;
if(l>=x && r<=y)
{
st[u]++;
tag[u]++;
pushdown(u);
return;
}
int mid=(l+r)/2;
if(mid>=x && l<=y) segst(l,mid,x,y,u*2);
if(r>=x && mid+1<=y) segst(mid+1,r,x,y,u*2+1);
pushup(u);
}
int ask(int l,int r,int x,int y,int u)
{
if(l>=x && r<=y) {pushdown(u);return seg[u];}
if(l==r) return 0;
pushdown(u);
int mid=(l+r)/2;
int k=0;
if(mid>=x && l<=y) k+=ask(l,mid,x,y,u*2);
if(r>=x && mid+1<=y) k+=ask(mid+1,r,x,y,u*2+1);
return k;
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
int x=a[i];
for(int j=1;j<=6;j++) b[i][j]=sqrt(x),x=sqrt(x);
}
build_tree(1,n,1);
scanf("%lld",&m);
while(m--)
{
int op,x,y;
scanf("%lld%lld%lld",&op,&x,&y);
if(op==0) update(1,n,x,y,1),segst(1,n,x,y,1);
else
{
printf("%lld\n",ask(1,n,x,y,1));
}
}
}
这道题我超时了,代码求调