Description
![](https://i-blog.csdnimg.cn/blog_migrate/ee798063a36a8b0f412e2953c5e8dd84.png)
Input
Output
每次x=1时,每行一个整数,表示这次旅行的开心度
Sample Input
4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4
Sample Output
101
11
11
11
11
HINT
对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9
解题的关键在于一个数开方6次之后值就会停止变化恒等于1或者0
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #pragma GCC diagnostic error "-std=c++11" #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define esp 1e-9 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; const int maxn=100006; ll tree[maxn<<2]; int n,m,l,r,val,vis[maxn<<2]; void pushup(int root) { tree[root]=tree[root<<1]+tree[root<<1|1]; vis[root]=vis[root<<1]&&vis[root<<1|1]; } void build(int l,int r,int root) { if(l==r) { scanf("%lld",&tree[root]); if(tree[root]==0 || tree[root]==1) vis[root]=1; return ; } int mid=l+r>>1; build(l,mid,root<<1); build(mid+1,r,root<<1|1); pushup(root); } void update(int L,int R,int l,int r,int root) { int mid=l+r>>1; if(l==r){ tree[root]=(ll)sqrt(tree[root]); if(tree[root]==0 || tree[root]==1) vis[root]=1; return ; } if(L<=mid && !vis[root<<1]) update(L,R,l,mid,root<<1);//标记数组为1之后此值恒定不变 if(R>mid && !vis[root<<1|1]) update(L,R,mid+1,r,root<<1|1); pushup(root); } ll query(int L,int R,int l,int r,int root) { if(L<=l && R>=r) return tree[root]; ll ans=0; int mid=l+r>>1; if(L<=mid) ans+=query(L,R,l,mid,root<<1); if(R>mid) ans+=query(L,R,mid+1,r,root<<1|1); return ans; } int main() { scanf("%d",&n); build(1,n,1); scanf("%d",&m); while(m--) { scanf("%d%d%d",&val,&l,&r); if(val==1) printf("%lld\n",query(l,r,1,n,1)); else update(l,r,1,n,1); } return 0; }