#include<stdio.h>
#include<stdlib.h>
int ssearch(int *a,int l,int h,int k)
{
if(l + k -1 > h)
return -1;
else
return a[l+k-1];
}
int kthlargest(int *a,int *b,int la,int ra,int lb,int rb,int k)
{
//get optimum mida and midb
int mida = la + k/2 - 1,midb = lb + k/2 - 1 + k%2;
if(midb>rb)
{
mida += midb-rb;
midb = rb;
}
else if(mida>ra)
{
midb += mida-ra;
mida = ra;
}
//check extremes in case one array expires
if(mida<la && midb<lb)
return -1;
if(mida>ra || mida<la || la>ra)
{
if(la>ra)
return ssearch(b,lb,rb,k);
else
return ssearch(b,lb,rb,k -(ra-la+1));
}
if(midb>rb || midb<lb || lb>rb)
{
if(lb>rb)
return ssearch(a,la,ra,k);
else
return ssearch(a,la,ra,k -(rb-lb+1));
}
//logic
//both mid at last positions
if(midb==rb)
if(mida==ra)
return a[mida]>=b[midb] ? a[mida] : b[midb];
//either way
if(b[midb]>=a[mida])
if(mida==ra || a[mida+1]>=b[midb])
return b[midb];
else
return kthlargest(a,b,mida+1,ra,lb,midb-1,k-mida-1+la);
else
if (midb==rb || a[mida]<=b[midb+1])
return a[mida];
else
return kthlargest(a,b,la,mida-1,midb+1,rb,k-midb-1+lb);
}
int main()
{
int a[]={4,8,12,18,25,33,56};
int b[]={1,2,3,6,17,18,25,26,32,89};
int k,i;
for(i=0;i<sizeof(a)/sizeof(int);i++)
for(i=0;i<sizeof(b)/sizeof(int);i++)
if(k==1)
printf("kth smallest is %d\n",a
[0]>b
[0]?b
[0]:a
[0]); else
printf("k th smallest element is %d\n",kthlargest
(a
,b
,0,sizeof(a
)/sizeof(int)-1,0,sizeof(b
)/sizeof(int)-1,k
)); return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CgppbnQgc3NlYXJjaChpbnQgKmEsaW50IGwsaW50IGgsaW50IGspCnsKCWlmKGwgKyBrIC0xID4gaCkKCQlyZXR1cm4gLTE7CgllbHNlCgkJcmV0dXJuIGFbbCtrLTFdOwkKfQoKaW50IGt0aGxhcmdlc3QoaW50ICphLGludCAqYixpbnQgbGEsaW50IHJhLGludCBsYixpbnQgcmIsaW50IGspCnsKCS8vZ2V0IG9wdGltdW0gbWlkYSBhbmQgbWlkYgkKCWludCBtaWRhID0gbGEgKyBrLzIgLSAxLG1pZGIgPSBsYiArIGsvMiAtIDEgKyBrJTI7CgoJaWYobWlkYj5yYikKCXsKCQltaWRhICs9IG1pZGItcmI7CgkJbWlkYiA9IHJiOwoJfQoJZWxzZSBpZihtaWRhPnJhKQoJewoJCW1pZGIgKz0gbWlkYS1yYTsKCQltaWRhID0gIHJhOwoJfQoJCgkvL2NoZWNrIGV4dHJlbWVzIGluIGNhc2Ugb25lIGFycmF5IGV4cGlyZXMKCQoJaWYobWlkYTxsYSAmJiBtaWRiPGxiKQoJCXJldHVybiAtMTsKCWlmKG1pZGE+cmEgfHwgbWlkYTxsYSB8fCBsYT5yYSkKCXsKCQlpZihsYT5yYSkKCQkJcmV0dXJuIHNzZWFyY2goYixsYixyYixrKTsKCQllbHNlCgkJCXJldHVybiBzc2VhcmNoKGIsbGIscmIsayAtKHJhLWxhKzEpKTsKCX0KCWlmKG1pZGI+cmIgfHwgbWlkYjxsYiB8fCBsYj5yYikKCXsKCQlpZihsYj5yYikKCQkJcmV0dXJuIHNzZWFyY2goYSxsYSxyYSxrKTsKCQllbHNlCgkJCXJldHVybiBzc2VhcmNoKGEsbGEscmEsayAtKHJiLWxiKzEpKTsJCQoJfQkKCQoJLy9sb2dpYwoJLy9ib3RoIG1pZCBhdCBsYXN0IHBvc2l0aW9ucwkJCgkJaWYobWlkYj09cmIpCgkJCWlmKG1pZGE9PXJhKQoJCQkJcmV0dXJuIGFbbWlkYV0+PWJbbWlkYl0gPyBhW21pZGFdIDogYlttaWRiXTsKCS8vZWl0aGVyIHdheQoJCWlmKGJbbWlkYl0+PWFbbWlkYV0pCgkJCWlmKG1pZGE9PXJhIHx8IGFbbWlkYSsxXT49YlttaWRiXSkKCQkJCXJldHVybiBiW21pZGJdOwoJCQllbHNlCgkJCQlyZXR1cm4ga3RobGFyZ2VzdChhLGIsbWlkYSsxLHJhLGxiLG1pZGItMSxrLW1pZGEtMStsYSk7CgkJCQkJCQoJCWVsc2UKCQkJaWYgKG1pZGI9PXJiIHx8IGFbbWlkYV08PWJbbWlkYisxXSkKCQkJCXJldHVybiBhW21pZGFdOwoJCQllbHNlCgkJCQlyZXR1cm4ga3RobGFyZ2VzdChhLGIsbGEsbWlkYS0xLG1pZGIrMSxyYixrLW1pZGItMStsYik7Cn0KCgppbnQgbWFpbigpCnsKCWludCBhW109ezQsOCwxMiwxOCwyNSwzMyw1Nn07CglpbnQgYltdPXsxLDIsMyw2LDE3LDE4LDI1LDI2LDMyLDg5fTsKCWludCBrLGk7CgoJZm9yKGk9MDtpPHNpemVvZihhKS9zaXplb2YoaW50KTtpKyspCgkJcHJpbnRmKCIgJWQgIixhW2ldKTsKCXByaW50ZigiXG4iKTsKCQoJZm9yKGk9MDtpPHNpemVvZihiKS9zaXplb2YoaW50KTtpKyspCgkJcHJpbnRmKCIgJWQgIixiW2ldKTsKCXByaW50ZigiXG4iKTsKCQoJcHJpbnRmKCJlbnRlciBrXG4iKTsKCXNjYW5mKCIlZCIsJmspOwoJaWYoaz09MSkKCQlwcmludGYoImt0aCBzbWFsbGVzdCBpcyAlZFxuIixhWzBdPmJbMF0/YlswXTphWzBdKTsKCWVsc2UKCQlwcmludGYoImsgdGggc21hbGxlc3QgZWxlbWVudCBpcyAlZFxuIixrdGhsYXJnZXN0KGEsYiwwLHNpemVvZihhKS9zaXplb2YoaW50KS0xLDAsc2l6ZW9mKGIpL3NpemVvZihpbnQpLTEsaykpOwoJcmV0dXJuIDA7Cn0KCg==