莫名 TLE
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, sum[500005];
void build(int u, int l, int r)
{
if (l == r)
{
cin >> sum[u];
return ;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
sum[u] = sum[u << 1] + sum[u << 1 | 1];
}
void mdi(int u, int l, int r, int l2, int r2)
{
if (sum[u] <= r - l + 1)
{
return ;
}
if (l == r)
{
sum[u] = sqrt(sum[u]);
return ;
}
int mid = (l + r) >> 1;
if (l2 <= mid)
{
mdi(u << 1, l, mid, l2, r2);
}
if (r2 > mid)
{
mdi(u << 1 | 1, mid + 1, r, l2, r2);
}
sum[u] = sum[u << 1] + sum[u << 1 | 1];
}
int qry(int u, int l, int r, int l2, int r2)
{
if (l2 <= l && r <= r2)
{
return sum[u];
}
int mid = (l + r) >> 1;
int ans = 0;
if (l2 <= mid)
{
ans += qry(u << 1, l, mid, l2, r2);
}
if (r2 > mid)
{
ans += qry(u << 1 | 1, mid + 1, r, l2, r2);
}
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int cnt = 0;
while (cin >> n)
{
cout << "Case #" << ++ cnt << ":\n";
build(1, 1, n);
cin >> m;
while (m --)
{
int opt, x, y;
cin >> opt >> x >> y;
if (x > y)
{
swap(x, y);
}
if (opt == 0)
{
mdi(1, 1, n, x, y);
}
else
{
cout << qry(1, 1, n, x, y) << endl;
}
}
cout << endl;
memset(sum, 0, sizeof(sum));
}
}