#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = (int) 5e5 + 7;
const int B = 317;
int x[N], y[N], oldx[N], oldy[N], sum[N];
int n, q;
struct Query {
int a;
int b;
int c;
int id;
};
bool operator < (const Query &a, const Query &b) {
return a.a / B < b.a / B || (a.a / B == b.a / B && a.b < b.b);
}
Query queries[N];
int sol[N];
vector<int> inds[2][N];
bool inside[N];
int aib[N], total = 0;
void update(int x, int val) {
for (int i = x; i < N; i += i & -i) {
aib[i] += val;
}
}
int query(int x) {
int ret = 0;
for (int i = x; i >= 1; i -= i & -i) {
ret += aib[i];
}
return ret;
}
void contract(int a, bool where) {
for (auto &it : inds[where][a]) {
if (inside[it] == false) {
continue;
}
update(sum[it], -1);
inside[it] = false;
total--;
}
}
void expand(int a, bool where, int least) {
for (auto &it : inds[where][a]) {
if (inside[it] == true) {
continue;
}
int cur = (where == 0 ? oldy[it] : oldx[it]);
if (cur >= least) {
update(sum[it], +1);
inside[it] = true;
total++;
}
}
}
void Mo() {
int a = N - 1, b = N - 1;
for (int i = 1; i <= q; i++) {
int qa = queries[i].a;
int qb = queries[i].b;
while (a > qa) {
a--;
expand(a, 0, b);
}
while (b > qb) {
b--;
expand(b, 1, a);
}
while (a < qa) {
contract(a, 0);
a++;
}
while (b < qb) {
contract(b, 1);
b++;
}
sol[queries[i].id] = total - query(queries[i].c - 1);
}
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// freopen("input", "r", stdin);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> x[i] >> y[i];
}
for (int i = 1; i <= q; i++) {
cin >> queries[i].a >> queries[i].b >> queries[i].c;
queries[i].id = i;
}
sort(queries + 1, queries + q + 1);
{ /// normalizare
vector<int> vals;
map<int, int> mp;
for (int i = 1; i <= n; i++) {
vals.push_back(x[i] + y[i]);
}
for (int i = 1; i <= q; i++) {
vals.push_back(queries[i].c);
}
sort(vals.begin(), vals.end());
int cnt = 0;
for (auto &i : vals) {
if (mp[i] == 0) {
mp[i] = ++cnt;
}
}
for (int i = 1; i <= n; i++) {
sum[i] = mp[x[i] + y[i]];
}
for (int i = 1; i <= q; i++) {
queries[i].c = mp[queries[i].c];
}
vals.clear();
mp.clear();
for (int i = 1; i <= n; i++) {
vals.push_back(x[i]);
vals.push_back(y[i]);
}
for (int i = 1; i <= q; i++) {
vals.push_back(queries[i].a);
vals.push_back(queries[i].b);
}
sort(vals.begin(), vals.end());
cnt = 0;
for (auto &i : vals) {
if (mp[i] == 0) {
mp[i] = ++cnt;
}
}
for (int i = 1; i <= n; i++) {
oldx[i] = x[i];
oldy[i] = y[i];
x[i] = mp[x[i]];
y[i] = mp[y[i]];
}
for (int i = 1; i <= q; i++) {
queries[i].a = mp[queries[i].a];
queries[i].b = mp[queries[i].b];
}
for (int i = 1; i <= n; i++) {
inds[0][x[i]].push_back(i);
inds[1][y[i]].push_back(i);
}
}
Mo();
for (int i = 1; i <= q; i++) {
cout << sol[i] << "\n";
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
16 ms |
23872 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2777 ms |
41804 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2777 ms |
41804 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
16 ms |
23872 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |