「一本通 4.3 练习 2」花神游历各国(loj10128)
说明:精度老是调不对啊!!!!!!!!!!!!!!!!!!老是有一两个点出现舍入误差。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 100010;
inline void qread(int &x){
x = 0;
register int ch = getchar();
while(ch < '0' || ch > '9')
ch =getchar();
while(ch >='0' && ch <='9')
x = 10 * x + ch - 48, ch = getchar();
}
int n, q;
int data[maxn];
long long sum[maxn << 2];
inline void update(const int &x){
sum[x] = sum[x << 1] + sum[x << 1 | 1];
}
void build(int l, int r, int x){
if(l == r){
sum[x] = data[l];
return ;
}
int mid = (l + r) >> 1;
build(l, mid, x << 1);
build(mid + 1, r, x << 1 | 1);
update(x);
}
void add(int l, int r, int L, int R, int x){
if(l == r){
sum[x] = floor(sqrt(sum[x]));
return ;
}
if(sum[x] != (r - l + 1) && sum[x] != 0){
int mid = (l + r) >> 1;
if(R > mid) add(mid + 1, r, L, R, x << 1 | 1);
if(L <= mid) add(l, mid, L, R, x << 1);
update(x);
}
}
long long ask(int l, int r, int L, int R, int x){
if(L <= l && R >= r)
return sum[x];
int mid = (l + r) >> 1;
long long ans = 0;
if(L <= mid) ans += ask(l, mid, L, R, x << 1);
if(R > mid) ans += ask(mid + 1, r, L, R, x << 1 | 1);
return ans;
}
inline void init(){
qread(n);
for(int i=1; i<=n; ++i) qread(data[i]);
build(1, n, 1);
qread(q);
}
int main(void) {
freopen("2.txt", "w", stdout);
init();
while(q--){
int op, l, r;
qread(op), qread(l), qread(r);
if(op == 1)
printf("%lld\n", ask(1, n, l, r, 1));
else
add(1, n, l, r, 1);
}
}