已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n,

现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。

输入格式

第一行有三个数,分别是长度m、长度n和k,中间空格相连(1<=m,n<=100000; 1<=k<=m+n)。

第二行m个数分别是非减序的序列X。第三行n个数分别是非减序的序列Y。

输出格式

序列X和Y的第k小的数。



#define N 100010


using namespace std;


int a[N];

int b[N];

int n,m,k;


int main()

{

    int la,lb,ra,rb,ma,mb;

    int k,t;

    //freopen("in.txt","r",stdin);

    scanf("%d%d%d",&n,&m,&k);

int i;

    for( i=1;i<=n;i++) scanf("%d",&a[i]);

    for( i=1;i<=m;i++) scanf("%d",&b[i]);


    la = lb = 1;

    ra = n;

    rb = m;


    while(la<=ra && lb<=rb)

    {

        ma = (la+ra)/2;

        mb = (lb+rb)/2;

        t = ma+mb-la-lb+2;


        if(b[mb]>a[ma])

        {

            if(t>k) rb = mb-1;

            else

            {

                k =k-(ma-la+1);

                la = ma+1;

            }

        }

        else

        {

            if(t>k) ra = ma -1;

            else

            {

                k=k- (mb-lb+1);

                lb = mb+1;

            }

        }

    }


    if(la>ra) printf("%d\n",b[lb+k-1]);

    else printf("%d\n",a[la+k-1]);


    return 0;

}