Submit Time:2024-01-04 13:22:41

运行 ID: 119137

#include<bits/stdc++.h> using namespace std; int n,bls[5000000],v[5000000],sum[5000000],bl; bool flg[5000000]; inline long long in(long long ans=0,long long f=0) { char c=getchar(); for(; c<'0' || c>'9'; f^=(c=='-'),c=getchar()); for(; c<='9' && c>='0'; c=getchar())ans=(ans<<3)+(ans<<1)+(c^48); return f?-ans:ans; } void change(int l,int r) { for(int i=l; i<=min(bls[l]*bl,r); i++){ sum[bls[l]]-=v[i]; v[i]=sqrt(v[i]); sum[bls[l]]+=v[i]; } if(bls[l]!=bls[r]){ for(int i=(bls[r]-1)*bl+1; i<=min(r,n); i++){ sum[bls[r]]-=v[i]; v[i]=sqrt(v[i]); sum[bls[r]]+=v[i]; } } for(int i=bls[l]+1; i<=bls[r]-1; i++){ if(!flg[i]){ flg[i]=1,sum[i]=0; for(int k=(i-1)*bl+1; k<=i*bl; k++){ v[k]=sqrt(v[k]); if(v[k]>1)flg[i]=0; sum[i]+=v[k]; } } } } int count(int l,int r) { int ans=0; for(int i=l; i<=min(bls[l]*bl,r); i++) ans+=v[i]; if(bls[l]!=bls[r]) for(int i=(bls[r]-1)*bl+1; i<=r; i++) ans+=v[i]; for(int i=bls[l]+1; i<=bls[r]-1; i++) ans+=sum[i]; return ans; } int main() { n=in(),bl=sqrt(n); for(int i=1; i<=n; i++)v[i]=in(),bls[i]=(i-1)/bl+1,sum[bls[i]]+=v[i]; for(int opt,l,r,c,i=1; i<=n; i++){ scanf("%d%d%d%d",&opt,&l,&r,&c); if(!opt)change(l,r); else printf("%d\n",count(l,r)); } return 0; }