vector<pair<int, int> > getMatch(V2D vX, V2D vY) {
     X = vX;
     Y = vY;
     SZ = X.size();
     for(int i = 0; i < SZ; ++i)
         for(int j = 0; j < SZ; ++j)
             Y[i][vY[i][j]] = j;
     mX.assign(SZ, -1);
     mY.assign(SZ, -1);
     k.assign(SZ, 0);
     bool yes = true;
     while(true) {
         bool mark = true;
         int i;
         for(i = 0; i < SZ; ++i) {
             if(mX[i] == -1) {
                 while(k[i] < SZ) {
                     int j = X[i][k[i]];
                     if( mY[j] == -1 ) {
                         mX[i] = j;
                         mY[j] = i;
                         break;
                     }
                     if( Y[j][i] < Y[j][mY[j]] ) {
                         mX[mY[j]] = -1;
                         k[mY[j]]++;
                         mX[i] = j;
                         mY[j] = i;
                         break;
                     }
                     ++k[i];
                 }
                 if(mX[i] == -1)
                     mark = false;
                 break;
             }
         }
         if(i == N)
             break;
         if(!mark) {
             yes = false;
             break;
         }
     }
     vector<pair<int, int> > ans(0);
     if(!yes) return ans;
     for(int i = 0; i < SZ; ++i)
         ans.push_back(make_pair(i, mX[i]));
     return ans;
 }