#include <iostream>
using namespace std;
struct Tree {
int *segments;
int treeSize;
Tree(int size) {
treeSize = 1 << (size + 1);
segments = new int[treeSize];
for (int i=0; i<treeSize; i++) segments[i] = 0;
}
void update(int start, int end, int current, int globalStart, int globalEnd) {
if (globalEnd <= start || globalStart >= end || segments[current] > 0) return;
if (globalStart <= start && globalEnd >= end) {
segments[current]++;
}
if (end - start > 1) {
int split = (start + end + 1) >> 1;
update(start, split, 2 * current, globalStart, globalEnd);
update(split, end, 2 * current + 1, globalStart, globalEnd);
}
}
void add(int start, int end) {
update(0, treeSize/2, 1, start, end + 1);
}
bool marked(int x) {
return segments[treeSize/2 + x] > 0;
}
};
int main() {
ios_base::sync_with_stdio(0);
int n, m;
cin >> n >> m;
int treeSize = 0;
while ((1 << treeSize) - 1 < n) treeSize++;
Tree yellow = Tree(treeSize);
Tree blue = Tree(treeSize);
Tree red = Tree(treeSize);
for (int i=0; i<m; i++) {
int s, e, c;
cin >> s >> e >> c;
if (c == 1) {
yellow.add(s, e);
} else if (c == 2) {
blue.add(s, e);
} else {
red.add(s, e);
}
}
int sum = 0;
for (int i=1; i<=n; i++) {
if (yellow.marked(i) && blue.marked(i) && !red.marked(i)) sum++;
}
cout << sum << endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <iostream> using namespace std; struct Tree { int *segments; int treeSize; Tree(int size) { treeSize = 1 << (size + 1); segments = new int[treeSize]; for (int i=0; i<treeSize; i++) segments[i] = 0; } void update(int start, int end, int current, int globalStart, int globalEnd) { if (globalEnd <= start || globalStart >= end || segments[current] > 0) return; if (globalStart <= start && globalEnd >= end) { segments[current]++; } if (end - start > 1) { int split = (start + end + 1) >> 1; update(start, split, 2 * current, globalStart, globalEnd); update(split, end, 2 * current + 1, globalStart, globalEnd); } } void add(int start, int end) { update(0, treeSize/2, 1, start, end + 1); } bool marked(int x) { return segments[treeSize/2 + x] > 0; } }; int main() { ios_base::sync_with_stdio(0); int n, m; cin >> n >> m; int treeSize = 0; while ((1 << treeSize) - 1 < n) treeSize++; Tree yellow = Tree(treeSize); Tree blue = Tree(treeSize); Tree red = Tree(treeSize); for (int i=0; i<m; i++) { int s, e, c; cin >> s >> e >> c; if (c == 1) { yellow.add(s, e); } else if (c == 2) { blue.add(s, e); } else { red.add(s, e); } } int sum = 0; for (int i=1; i<=n; i++) { if (yellow.marked(i) && blue.marked(i) && !red.marked(i)) sum++; } cout << sum << endl; return 0; } |
English