#include #include int hunterNum; int grooveNum; typedef struct { int x1; int y1; int x2; int y2; } groove_t; typedef struct { int x; int y; int endpoint; } vec2_t; typedef struct { int x; int y; int moving; } hunter_t; int main() { scanf("%d%d\n", &hunterNum, &grooveNum); hunter_t hunters[hunterNum]; int globalMaxY = 0; int maxY[hunterNum]; for (int i = 0; i < hunterNum; ++i) { maxY[i] = 0; hunters[i].x = i; hunters[i].y = 0; hunters[i].moving = 1; } groove_t grooves[grooveNum]; for (int i = 0; i < grooveNum; ++i) { scanf("%d%d%d%d\n", &grooves[i].x1, &grooves[i].y1, &grooves[i].x2, &grooves[i].y2); --grooves[i].x1; --grooves[i].x2; if (grooves[i].y1 > maxY[grooves[i].x1]) maxY[grooves[i].x1] = grooves[i].y1; if (grooves[i].y2 > maxY[grooves[i].x2]) maxY[grooves[i].x2] = grooves[i].y2; if (grooves[i].y1 > globalMaxY) globalMaxY = grooves[i].y1; } vec2_t field[hunterNum*globalMaxY]; memset(field, 0, sizeof(field)); for (int i = 0; i < grooveNum; ++i) { groove_t* groove = &grooves[i]; int pos = groove->y1*hunterNum+groove->x1; field[pos].endpoint = 1; field[pos].x = groove->x2; field[pos].y = groove->y2; pos = groove->y2*hunterNum+groove->x2; field[pos].endpoint = 1; field[pos].x = groove->x1; field[pos].y = groove->y1; } int moved = 0; do { moved = 0; for (int i = 0; i < hunterNum; ++i) { hunter_t* hunter = &hunters[i]; if (!hunter->moving) { continue; } ++hunter->y; moved = 1; int pos = hunter->y*hunterNum+hunter->x; if (field[pos].endpoint) { hunter->x = field[pos].x; hunter->y = field[pos].y; } if (hunter->y == maxY[hunter->x]) hunter->moving = 0; } } while (moved); for (int i = 0; i < hunterNum; ++i) { printf("%d\n", hunters[i].x+1); } return 0; }