发现这个信息线段树不好维护喵~小男娘也不会喵~
但是发现可以离线喵~从小到大依次处理数字和询问喵~于是问题就变成了单点加一区间求和喵~直接变成树状数组板子了喵~
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int n;
int m;
const int MAXI = 1e5;
array<vector<int>, MAXI + 1> aPos;
// idx, l, r
array<vector<array<int, 3>>, MAXI + 1> queries;
vector<int> res;
array<int, MAXI + 1> szsz;
void Addi(int x) {
while (x <= MAXI) {
szsz[x]++;
x += x & -x;
}
}
int Pre(int x) {
int res = 0;
while (x > 0) {
res += szsz[x];
x &= x - 1;
}
return res;
}
int Sum(int l, int r) {
return Pre(r) - Pre(l - 1);
}
void Solve() {
cin >> n >> m;
res.resize(m);
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
aPos[a].push_back(i);
}
for (int i = 0; i < m; i++) {
int l, r, k;
cin >> l >> r >> k;
queries[k].push_back({i, l, r});
}
for (int i = 1; i <= MAXI; i++) {
for (int pos : aPos[i]) {
Addi(pos);
}
for (auto query : queries[i]) {
res[query[0]] = Sum(query[1], query[2]);
}
}
for (int x : res) {
cout << x << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
Solve();
}

京公网安备 11010502036488号