- 单点加,区间求和(cdq分治)
1
- @ 2026-8-3 11:03:50
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
void solve() {
int n, m;
cin >> n >> m;
vector<array<int, 5>> a;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
a.push_back({i, 0, 1, x, 0});
}
vector<bool> isq(m + 1);
vector<ll> ans(m + 1);
for (int i = 1; i <= m; i++) {
int o, x, y;
cin >> o >> x >> y;
if (o == 1) {
a.push_back({x, i, o, y, 0});
} else {
isq[i] = 1;
a.push_back({y, i, o, 1, i});
if (x > 1) a.push_back({x - 1, i, o, -1, i});
}
}
function<void(int, int)> cdq = [&] (int l, int r) {
if (l == r) return;
int m = l + r >> 1;
cdq(l, m); cdq(m + 1, r);
sort(a.begin() + l, a.begin() + m + 1);
sort(a.begin() + m + 1, a.begin() + r + 1);
ll sum = 0;
for (int j = m + 1, i = l; j <= r; j++) {
while (i <= m) {
if (a[i][2] == 2) {
i++;
} else {
if (a[i][0] <= a[j][0]) {
sum += a[i][3];
i++;
} else {
break;
}
}
}
if (a[j][2] == 2) {
ans[a[j][4]] += a[j][3] * sum;
}
}
};
cdq(0, (int)a.size() - 1);
for (int i = 1; i <= m; i++) if (isq[i]) cout << ans[i] << '\n';
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
/*
g++ -std=c++14 1.cpp -o 1 && 1 < in.txt > out.txt
g++ -std=c++17 1.cpp -o 1 && ./1 < in.txt > out.txt
*/
0 条评论
目前还没有评论...
信息
- ID
- 547
- 时间
- ms
- 内存
- MiB
- 难度
- 7
- 标签
- 递交数
- 17
- 已通过
- 9
- 上传者