# include <stdio.h>
# define bool int
void quickSort(int *, int, int);
void hasArrayTwoCandidates(int A[], int arr_size, int sum)
{
int l, r;
/* Sort the elements */
quickSort(A, 0, arr_size-1);
/* Now look for the two candidates in the sorted
array*/
l = 0;
r = arr_size-1;
while(l < r)
{
if(A[l] + A[r] == sum)
{
printf(" %d %d " , A[l], A[r]);
l++; r--;
}
else if(A[l] + A[r] < sum)
l++;
else // A[i] + A[j] > sum
r--;
}
}
/* Driver program to test above function */
int main()
{
int A[] = {-4,-4,-4,-4,-4,1,2,3,3,4,5,6,10};
int n = 6;
int arr_size = 13;
hasArrayTwoCandidates(A, arr_size, n);
getchar();
return 0;
}
/* FOLLOWING FUNCTIONS ARE ONLY FOR SORTING
PURPOSE */
void exchange(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int partition(int A[], int si, int ei)
{
int x = A[ei];
int i = (si - 1);
int j;
for (j = si; j <= ei - 1; j++)
{
if(A[j] <= x)
{
i++;
exchange(&A[i], &A[j]);
}
}
exchange (&A[i + 1], &A[ei]);
return (i + 1);
}
/* Implementation of Quick Sort
A[] --> Array to be sorted
si --> Starting index
ei --> Ending index
*/
void quickSort(int A[], int si, int ei)
{
int pi; /* Partitioning index */
if(si < ei)
{
pi = partition(A, si, ei);
quickSort(A, si, pi - 1);
quickSort(A, pi + 1, ei);
}
}
IyBpbmNsdWRlIDxzdGRpby5oPgojIGRlZmluZSBib29sIGludAogIAp2b2lkIHF1aWNrU29ydChpbnQgKiwgaW50LCBpbnQpOwogIAp2b2lkIGhhc0FycmF5VHdvQ2FuZGlkYXRlcyhpbnQgQVtdLCBpbnQgYXJyX3NpemUsIGludCBzdW0pCnsKICAgIGludCBsLCByOwogIAogICAgLyogU29ydCB0aGUgZWxlbWVudHMgKi8KICAgIHF1aWNrU29ydChBLCAwLCBhcnJfc2l6ZS0xKTsKICAKICAgIC8qIE5vdyBsb29rIGZvciB0aGUgdHdvIGNhbmRpZGF0ZXMgaW4gdGhlIHNvcnRlZAogICAgICAgYXJyYXkqLwogICAgbCA9IDA7CiAgICByID0gYXJyX3NpemUtMTsKICAgIHdoaWxlKGwgPCByKQogICAgewogICAgICAgICBpZihBW2xdICsgQVtyXSA9PSBzdW0pCiAgICAgICAgIHsKCSAgICAgcHJpbnRmKCIgJWQgJWQgIiAsIEFbbF0sIEFbcl0pOyAKICAgICAgICAgICAgICBsKys7IHItLTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmKEFbbF0gKyBBW3JdIDwgc3VtKQogICAgICAgICAgICAgIGwrKzsKICAgICAgICAgZWxzZSAvLyBBW2ldICsgQVtqXSA+IHN1bQogICAgICAgICAgICAgIHItLTsKICAgIH0gCiAgCn0KICAKLyogRHJpdmVyIHByb2dyYW0gdG8gdGVzdCBhYm92ZSBmdW5jdGlvbiAqLwppbnQgbWFpbigpCnsKICAgaW50IEFbXSA9IHstNCwtNCwtNCwtNCwtNCwxLDIsMywzLDQsNSw2LDEwfTsKICAgIGludCBuID0gNjsKICAgIGludCBhcnJfc2l6ZSA9IDEzOwogIAogIAogICAgaGFzQXJyYXlUd29DYW5kaWRhdGVzKEEsIGFycl9zaXplLCBuKTsKICAgICAgCiAgICBnZXRjaGFyKCk7CiAgICByZXR1cm4gMDsKfQogIAovKiBGT0xMT1dJTkcgRlVOQ1RJT05TIEFSRSBPTkxZIEZPUiBTT1JUSU5HCiAgICBQVVJQT1NFICovCnZvaWQgZXhjaGFuZ2UoaW50ICphLCBpbnQgKmIpCnsKICAgIGludCB0ZW1wOwogICAgdGVtcCA9ICphOwogICAgKmEgICA9ICpiOwogICAgKmIgICA9IHRlbXA7Cn0KIAppbnQgcGFydGl0aW9uKGludCBBW10sIGludCBzaSwgaW50IGVpKQp7CiAgICBpbnQgeCA9IEFbZWldOwogICAgaW50IGkgPSAoc2kgLSAxKTsKICAgIGludCBqOwogCiAgICBmb3IgKGogPSBzaTsgaiA8PSBlaSAtIDE7IGorKykKICAgIHsKICAgICAgICBpZihBW2pdIDw9IHgpCiAgICAgICAgewogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGV4Y2hhbmdlKCZBW2ldLCAmQVtqXSk7CiAgICAgICAgfQogICAgfQogICAgZXhjaGFuZ2UgKCZBW2kgKyAxXSwgJkFbZWldKTsKICAgIHJldHVybiAoaSArIDEpOwp9CiAKLyogSW1wbGVtZW50YXRpb24gb2YgUXVpY2sgU29ydApBW10gLS0+IEFycmF5IHRvIGJlIHNvcnRlZApzaSAgLS0+IFN0YXJ0aW5nIGluZGV4CmVpICAtLT4gRW5kaW5nIGluZGV4CiovCnZvaWQgcXVpY2tTb3J0KGludCBBW10sIGludCBzaSwgaW50IGVpKQp7CiAgICBpbnQgcGk7ICAgIC8qIFBhcnRpdGlvbmluZyBpbmRleCAqLwogICAgaWYoc2kgPCBlaSkKICAgIHsKICAgICAgICBwaSA9IHBhcnRpdGlvbihBLCBzaSwgZWkpOwogICAgICAgIHF1aWNrU29ydChBLCBzaSwgcGkgLSAxKTsKICAgICAgICBxdWlja1NvcnQoQSwgcGkgKyAxLCBlaSk7CiAgICB9Cn0=