题意:
有n艘战舰,每艘战舰的防护罩都有一定的能量,我军有秘密武器,每轰一次,一个区间内的战舰防护罩将为原来能量的开方,查询的则是这个区间内战舰防护罩的能量之和。
解析:开根号开到1就可以停止了
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
const ll mod=1000000007;
const int maxn=2e6+10;
const int inf=0x3f3f3f3f;
const double eps=1e-6;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int t,n,m,a,b,q,flag;
ll sum[maxn<<2];
void push_up(int rt){
sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){
if(l == r) {
scanf("%lld",&sum[rt]);
return;
}
int mid =(l+r)>>1;
build(lson);
build(rson);
push_up(rt);
}
void update(int a,int b,int l,int r,int rt){
if(r-l+1 == sum[rt]) return;
if(l==r){
sum[rt]=sqrt(double(sum[rt]));
return;
}
int mid=(l+r)>>1;
if(a<=mid) update(a,b,lson);
if(b>mid) update(a,b,rson);
push_up(rt);
}
ll query(int a,int b,int l,int r,int rt){
if(r-l+1 == sum[rt]) return (min(r,b) - max(l,a) + 1);//miao
if(a<=l && b>=r) return sum[rt];
int mid = (l+r)>>1;
ll ans=0;
if(a<=mid) ans+=query(a,b,lson);
if(b>mid) ans+=query(a,b,rson);
return ans;
}
int main(){
int cnt = 0;
while(~scanf("%d",&n)){
printf("Case #%d:\n", ++cnt);
build(1,n,1);
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&flag,&a,&b);
if(flag){
printf("%lld\n",query(min(a,b),max(a,b),1,n,1));
}else{
update(min(a,b),max(a,b),1,n,1);
}
}
puts("");
}
return 0;
}