提交时间:2022-02-09 11:53:49
运行 ID: 44645
#include<bits/stdc++.h> using namespace std; const int N=5000000; int n,bl[N],v[N],sum[N],block; bool flg[N]; void Change(int l,int r) { for(int i=l; i<=min(bl[l]*block,r); i++) { sum[bl[l]]-=v[i]; v[i]=sqrt(v[i]); sum[bl[l]]+=v[i]; } if(bl[l]!=bl[r]) { for(int i=(bl[r]-1)*block+1; i<=min(r,n); i++) { sum[bl[r]]-=v[i]; v[i]=sqrt(v[i]); sum[bl[r]]+=v[i]; } } for(int i=bl[l]+1; i<=bl[r]-1; i++) { if(!flg[i]) { flg[i]=1; sum[i]=0; for(int k=(i-1)*block+1; k<=i*block; k++) { v[k]=sqrt(v[k]); if(v[k]>1) flg[i]=0; sum[i]+=v[k]; } } } } int Query(int l,int r) { int ans=0; for(int i=l; i<=min(bl[l]*block,r); i++) ans+=v[i]; if(bl[l]!=bl[r]) for(int i=(bl[r]-1)*block+1; i<=r; i++) ans+=v[i]; for(int i=bl[l]+1; i<=bl[r]-1; i++) ans+=sum[i]; return ans; } int main() { scanf("%d",&n); block=sqrt(n); for(int i=1; i<=n; i++) { scanf("%d",&v[i]); bl[i]=(i-1)/block+1; sum[bl[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",Query(l,r)); } return 0; }