「一本通 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);
    }
}

posted @ 2018-08-14 11:31  junk_yao  阅读(203)  评论(0编辑  收藏  举报