#include #include #include #include //#include using std::vector; struct Segment { int start, end; bool operator==(const Segment &s1) { return (start == s1.start && end == s1.end); } }; bool sortSeg(Segment i, Segment j) { if (i.start == j.start) { return i.end < j.end; } return i.start < j.start; } vector fast_count_segments(vector starts, vector ends, vector points) { // Implement algo described here, really clever: // https://www.coursera.org/learn/algorithmic-toolbox/discussions/all/threads/QJ1jK9wNEeWdPBL2iFTrAw/replies/Ihiw4txhEeWK5g7mfcS2Xw/comments/oyAMaeIiEeWyqwpvChh66Q // l->1, p->2, r->3 for Segment.end property vector s(starts.size() + ends.size() + points.size()); vector p(points.size()); Segment tempSeg; for (int i = 0; i < p.size(); i++) { tempSeg = {points[i], i}; p[i] = tempSeg; tempSeg = {points[i], 2}; s[2 * starts.size() + i] = tempSeg; } for (int i = 0; i < starts.size(); i++) { tempSeg = {starts[i], 1}; s[i] = tempSeg; tempSeg = {ends[i], 3}; s[i + starts.size()] = tempSeg; } std::sort(s.begin(), s.end(), sortSeg); std::sort(p.begin(), p.end(), sortSeg); vector results(points.size()); int count = 0; int j = 0; for (int i = 0; i < s.size(); i++) { if (s[i].end == 1) { count = count + 1; } if (s[i].end == 2) { results[j] = count; j = j + 1; } if (s[i].end == 3) { count = count - 1; } } vector finalResults(points.size()); for (int i = 0; i < finalResults.size(); i++) { finalResults[p[i].end] = results[i]; } return finalResults; } //TEST(SortSegment, Sort1) { // vector starts = { 0, 7 }; // vector ends = { 5, 10 }; // vector points = { 1, 6, 11 }; // vector results = { 1, 0, 0 }; // // vector cnt = fast_count_segments(starts, ends, points); // // ASSERT_EQ(cnt[0], 1); // ASSERT_EQ(cnt[1], 0); // ASSERT_EQ(cnt[2], 0); // ASSERT_EQ(cnt.size(), 3); //} int main() { int n, m; std::cin >> n >> m; vector starts(n), ends(n); for (size_t i = 0; i < starts.size(); i++) { std::cin >> starts[i] >> ends[i]; } vector points(m); for (size_t i = 0; i < points.size(); i++) { std::cin >> points[i]; } //use fast_count_segments vector cnt = fast_count_segments(starts, ends, points); for (size_t i = 0; i < cnt.size(); i++) { std::cout << cnt[i] << ' '; } }