/* @JUDGE_ID: 32472GK 1097 C++ */ #include #include #include #include #include using namespace std; struct area { int c,x,y,l; }; struct c_rect { int c,x1,y1,x2,y2; }; void calc_costa( const vector& areas, int A, vector& careas ) { careas = areas; for(int i=0; i!=areas.size(); ++i) careas[i].x -= (A-1), careas[i].y -= (A-1), careas[i].l += (A-1); } void remap( map& fx, map& fy, const vector& careas, vector& ans ) { ans.clear(); for(int i=0; i!=careas.size(); ++i) { int x1 = careas[i].x; int y1 = careas[i].y; int x2 = careas[i].x + careas[i].l; int y2 = careas[i].y + careas[i].l; int im = careas[i].c; c_rect cr = {im, fx[x1], fy[y1], fx[x2], fy[y2]}; ans.push_back(cr); } } int main() { // input areas int L,A,M; cin >> L >> A >> M; vector as; for(int i=0; i!=M; ++i) { int im,l,x,y; cin >> im >> l >> x >> y; area a = {im,x,y,l}; as.push_back( a ); } // calc careas vector careas; calc_costa( as, A, careas ); // coordinate remapping set xs, ys; xs.insert(1); xs.insert(1+L); xs.insert(1+L-A); ys.insert(1); ys.insert(1+L); ys.insert(1+L-A); for(int i=0; i!=careas.size(); ++i) { xs.insert( careas[i].x ); xs.insert( careas[i].x + careas[i].l ); ys.insert( careas[i].y ); ys.insert( careas[i].y + careas[i].l ); } map fx, fy; int cnt=0; for(set::iterator it=xs.begin(); it!=xs.end(); ++it) { fx[*it] = cnt++; } cnt=0; for(set::iterator it=ys.begin(); it!=ys.end(); ++it) { fy[*it] = cnt++; } // remap vector crs; remap(fx,fy,careas,crs); // fill mesh static int mesh[201][201]; for(int i=0; i!=200; ++i) for(int j=0; j!=200; ++j) mesh[i][j] = 1; for(int i=0; i!=crs.size(); ++i) { c_rect& cr = crs[i]; for(int x=cr.x1; x( mesh[x][y], cr.c ); } // search minimum int minC = 255; int Xmin=fx[1], Ymin=fy[1], Xmax=fx[1+L-A], Ymax=fy[1+L-A]; for(int x=Xmin; x<=Xmax; ++x) for(int y=Ymin; y<=Ymax; ++y) minC = min( minC, mesh[x][y] ); // answer if( minC > 100 ) cout << "IMPOSSIBLE" << endl; else cout << minC << endl; return 0; }