Description
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; }