|
|
- 标记区间是否 已经全为1,暴力分块即可。
-
#include<bits/stdc++.h> using namespace std; #define maxn 56789 int a[maxn],n,sum[maxn],flag[maxn]; int b[maxn],op,l,r,c,tag; void solve(int x) { if(flag[x])return ; flag[x]=1; sum[x]=0; for(int i=x*tag; i<(x+1)*tag; i++) { a[i]=sqrt(a[i]); sum[x]+=a[i]; if(a[i]>1)flag[x]=0; } } void updata(int l,int r) { int i; for(i=l; i<=r&&i%tag; i++) { sum[i/tag]-=a[i]; a[i]=sqrt(a[i]); sum[i/tag]+=a[i]; } for(; i+tag-1<=r; i+=tag) solve(i/tag); for(; i<=r; i++) { sum[i/tag]-=a[i]; a[i]=sqrt(a[i]); sum[i/tag]+=a[i]; } } int query(int l,int r) { int ans=0,i; for(i=l; i<=r&&i%tag; i++)ans+=a[i]; for(; i+tag-1<=r; i+=tag)ans+=sum[i/tag]; for(; i<=r; i++)ans+=a[i]; return ans; } int main() { scanf("%d",&n); tag=sqrt(n); for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum[i/tag]+=a[i]; flag[i/tag]=0; } for(int i=0; i<n; i++) { scanf("%d%d%d%d",&op,&l,&r,&c); if(op==0)updata(l-1,r-1); else printf("%d\n",query(l-1,r-1)); } return 0; }