0ms TLE,蒟蒻硬是没看出错误…… >,.,<
Code:
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define il inline
#define ll long long
#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define mid (l + r >> 1)
#define N 100001
ll n, m, a[N], tot;
struct node {
ll data, l, r, tag;
} tr[N << 2];
il void build(ll rt, ll l, ll r) {
tr[rt].l = l; tr[rt].r = r;
if (l == r) {
tr[rt].data = a[l];
if (a[l] == 1 || a[l] == 0) tr[rt].tag = 1;
else tr[rt].tag = 0;
return;
}
build(ls, l, mid); build(rs, mid + 1, r);
tr[rt].data = tr[ls].data + tr[rs].data;
tr[rt].tag = tr[ls].tag && tr[rs].tag;
}
il void change(ll rt, ll l, ll r, ll x, ll y) {
if (l == r) {
tr[rt].data = sqrt(tr[rt].data);
if (tr[rt].data == 0 || tr[rt].data == 1) tr[rt].tag = 1;
else tr[rt].tag = 0;
return;
}
if (x <= mid && !tr[ls].tag) change(ls, l, mid, x, y);
if (y > mid && !tr[rs].tag) change(rs, mid + 1, r, x, y);
tr[rt].data = tr[ls].data + tr[rs].data;
tr[rt].tag = tr[ls].tag && tr[rs].tag;
}
il ll query(ll rt, ll l, ll r, ll x, ll y) {
if (x <= l && r <= y) return tr[rt].data;
ll ans = 0;
if (x <= mid) ans += query(ls, l, mid, x, y);
if (y > mid) ans += query(rs, mid + 1, r, x, y);
return ans;
}
signed main() {
// IOS;
while (cin >> n && n != EOF) {
cout << "Case #" << ++tot << ":" << '\n';
for (ll i = 1; i <= n; ++i) cin >> a[i];
build(1, 1, n);
cin >> m;
for (ll i = 1, op, x, y; i <= m; ++i) {
cin >> op >> x >> y;
if (x > y) swap(x, y);
if (op == 0) change(1, 1, n, x, y);
else cout << query(1, 1, n, x, y) << endl;
}
cout << '\n';
}
return 0;
}