HDU4027 线段树区间取根号

HDU4027

没什么难的

注意如果l > r, swap(l, r)

// Decline is inevitable,
// Romance will last forever.
//#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <deque>
#include <vector>
using namespace std;
#define mst(a, x) memset(a, x, sizeof(a))
#define INF 0x3f3f3f3f
//#define ll long long
#define int long long
const int maxn = 1e5 + 10;
//const int P = 1e9 + 7;
int n, m, q;
int P;
int a[maxn];
struct segement_tree {
    int l, r;
    int sum;
#define sum(x) tree[x].sum
#define l(x) tree[x].l
#define r(x) tree[x].r
}tree[maxn << 2];
void push(int p) {
    sum(p) = sum(p<<1) + sum(p << 1 | 1);
}
void build(int p, int l, int r) {
    l(p) = l; r(p) = r;
    if(l == r) {
        sum(p) = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(p<<1, l, mid);
    build(p<<1|1, mid + 1, r);
    push(p);
}
void change(int p, int l, int r) {
    if(r(p) == l(p)) {
        sum(p) = sqrt(sum(p));
        return;
    }
    if(r(p)-l(p)+1 >= sum(p)) return;
    int mid = (l(p) + r(p)) >> 1;
    if(l <= mid) change(p<<1, l, r);
    if(r > mid) change(p<<1|1, l, r);
    push(p);
}
int query(int p, int l, int r) {
    if(l <= l(p) && r >= r(p)) return sum(p);
    int ans = 0;
    int mid = (l(p) + r(p)) >> 1;
    if(l <= mid) ans += query(p<<1, l, r);
    if(r > mid) ans += query(p<<1|1, l, r);
    return ans;
}






void solve() {
    int t = 0;
    while(cin >> n) {
        
        for(int i = 1; i <= n; i++)
            cin >> a[i];
        for(int i = 1; i <= 4*n; i++)
            tree[i].sum = 0;
        build(1, 1, n);
        t++;
        cout << "Case #" << t << ":\n";
        cin >> m;
        while(m--) {
            int l, r, k;
            cin >> k >> l >> r;
            if(l > r) swap(l, r);
            if(!k) {
                change(1, l, r);
            }
            else {
                cout << query(1, l, r) << '\n';
            }
        }
        cout << '\n';
    }
    
}
signed main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//    int T;
//    cin >> T;
//    while(T--)
        solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_59273843/article/details/120668987