区间开根号是不具备整体性的,即和开根号不一定等于开根号的和。但是由于由于在longlong范围内的数开根号7次就会变成一所以我们单点更新也是可以的,剪枝就是如果一个区间的和等于区间的大小就不用再继续向下更新了,实现也简单;
ps:再注意几个坑,每组样例结束要多输出一个空行,and l,r的大小不确定
ac:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double pi = acos(-1);
namespace {
template <typename T> inline void read(T &x) {
x = 0; T f = 1;char s = getchar();
for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
for(; isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
x *= f;
}
}
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (int i = (n); i < (m); i++)
#define _rep(n,m,i) for (int i = (n); i <= (m); i++)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e5+5;
LL T[N<<2];
void push_up(int rt) {
T[rt] = T[rt<<1] + T[rt<<1|1];
}
void build(int rt, int l, int r) {
if(l == r) {
read(T[rt]);
return ;
}
int mid = l + r >> 1;
build(lson);build(rson);
push_up(rt);
}
void updata(int rt, int l, int r, int L, int R) {
if(L <= l && R >= r && T[rt] == r-l+1) return ;
if(l == r) {
T[rt] = sqrt(T[rt]);
return ;
}
int mid = l + r >> 1;
if(L <= mid) updata(lson, L, R);
if(R > mid) updata(rson, L, R);
push_up(rt);
}
LL qry(int rt, int l, int r, int L, int R) {
if(L <= l && r <= R) {
return T[rt];
}
int mid = l + r >> 1;
LL ret = 0;
if(L <= mid) ret += qry(lson, L, R);
if(R > mid) ret += qry(rson, L, R);
return ret;
}
int main() {
int n,m,l,r,op;
for(int id = 1; cin >> n; id++) {
printf("Case #%d:\n", id);
build(1,1,n);
read(m);
while(m--) {
read(op);read(l);read(r);
if(l > r) swap(l, r);
if(op) printf("%lld\n", qry(1,1,n,l,r));
else updata(1,1,n,l,r);
}
printf("\n");
}
}