#include // Ošklivý, ale praktický trik (funguje jen v GCC) using namespace std; struct segment { int left, right, height; }; bool operator< (const segment &A, const segment &B) { return A.left < B.left; } set top_view; int main() { int S, N; scanf("%d%d",&S,&N); top_view.insert( {0,S,0} ); top_view.insert( {S,S,0} ); // zarážka for (int n=0; n covered; auto it = --top_view.upper_bound( {bleft,bright,0} ); while (it->left < bright) { covered.push_back(*it); ++it; } int answer = 0; for (auto seg : covered) { answer = max( answer, seg.height ); top_view.erase(seg); } if (covered.front().left < bleft) top_view.insert( { covered.front().left, bleft, covered.front().height } ); top_view.insert( { bleft, bright, answer + bheight } ); if (covered.back().right > bright) top_view.insert( { bright, covered.back().right, covered.back().height } ); printf("%d\n",answer); } return 0; }