intkthSmallest(const vector<int>& a, const vector<int>& b, int k){ int ia = 0, ib = 0; int na = (int)a.size(), nb = (int)b.size();
while (true) { if (ia >= na) return b[ib + k - 1]; if (ib >= nb) return a[ia + k - 1]; if (k == 1) returnmin(a[ia], b[ib]);
int half = k >> 1; int newIa = min(ia + half, na) - 1; int newIb = min(ib + half, nb) - 1;
if (a[newIa] <= b[newIb]) { k -= (newIa - ia + 1); ia = newIa + 1; } else { k -= (newIb - ib + 1); ib = newIb + 1; } } }
intmain(){ int m, n; while (scanf("%d%d", &m, &n) == 2) { vector<int> a(m), b(n); for (int i = 0; i < m; ++i) scanf("%d", &a[i]); for (int i = 0; i < n; ++i) scanf("%d", &b[i]);
int k = (m + n + 1) / 2; // 下中位数(1-index) int ans = kthSmallest(a, b, k); printf("%d\n", ans); } return0; }
intkthByPartition(const vector<int>& A, const vector<int>& B, int k){ const vector<int> *pa = &A, *pb = &B; int n = (int)A.size(), m = (int)B.size();
if (n > m) { swap(n, m); swap(pa, pb); }
int L = max(0, k - m), R = min(k, n); while (L <= R) { int i = (L + R) >> 1; int j = k - i;
int aL = (i == 0 ? INT_MIN : (*pa)[i - 1]); int aR = (i == n ? INT_MAX : (*pa)[i]); int bL = (j == 0 ? INT_MIN : (*pb)[j - 1]); int bR = (j == m ? INT_MAX : (*pb)[j]);
if (aL <= bR && bL <= aR) { returnmax(aL, bL); } if (aL > bR) { R = i - 1; } else { L = i + 1; } }
return-1; }
intmain(){ int m, n; while (scanf("%d%d", &m, &n) == 2) { vector<int> a(m), b(n); for (int i = 0; i < m; ++i) scanf("%d", &a[i]); for (int i = 0; i < n; ++i) scanf("%d", &b[i]);
int k = (m + n + 1) / 2; // 下中位数(1-index) printf("%d\n", kthByPartition(a, b, k)); } return0; }