#include #include #include #include #include using namespace std; typedef struct { int x1; int y1; int x2; int y2; int id; int f; } roof; int n; roof roofs[40000]; int next[40000],deg[40000],flow[40000]; typedef struct { int x; int y; int t; int id; } event; bool operator<(event e1, event e2) { if (e1.x==e2.x) { if (e1.t==e2.t) { if (e1.t==1) return e1.ye2.y; } else return e1.t>e2.t; } else return e1.x events; int x; double height(roof r) { return r.y1+(double)(x-r.x1)*(r.y2-r.y1)/(r.x2-r.x1); } bool operator<(roof r1, roof r2) { return height(r1) active; set::iterator it; void findLower(roof r) { it = active.lower_bound(r); if (it!=active.begin()) { it--; next[r.id]=it->id; deg[it->id]++; } } int main() { int tests; scanf("%d",&tests); while (tests--) { scanf("%d",&n); events.clear(); for (int i=0;i0 && !active.empty()) { it=active.end(); it--; flow[it->id]+=events[i].x-events[i-1].x; } if (e.t==1) { if (r.y1r.y2) findLower(r); } } queue q; for (int i=0;i