#include <iostream>
#include <vector>
using namespace std;
//Find a sorted subsequence of size 3 in linear time
class Solution
{
private:
int seq1;
int seq2[2];
public:
vector<int> find3IncreasingNumbers(int * arr, int n)
{
vector<int> result;
if(n < 3) return result;
bool seq2Filled = false;
seq1 = arr[0];
for(int i = 1; i < n; ++i)
{
if(arr[i] < seq1)
seq1 = arr[i];
else if(arr[i] == seq1)
continue;
else if(!seq2Filled || arr[i] <= seq2[1]) {
seq2[0] = seq1;
seq2[1] = arr[i];
seq2Filled = true;
}
else {
result.push_back(seq2[0]);
result.push_back(seq2[1]);
result.push_back(arr[i]);
break;
}
}
return result;
}
};
int main() {
int arr1[] = {12, 11, 10, 5, 6, 2, 30};
int arr2[] = {1, 2, 3, 4};
int arr3[] = {4, 3, 1, 2};
int arr4[] = {12, 11, 10, 5, 6, 2, 30};
Solution so;
vector<int> resultTriple;
resultTriple = so.find3IncreasingNumbers(arr1, sizeof(arr1)/sizeof(int));
if(resultTriple.size())
cout<<"Result of arr1 : " <<resultTriple[0]<<" "<<resultTriple[1]<<" "<<resultTriple[2]<<endl;
else
cout << "Did not find increasing triple in arr1."<<endl;
resultTriple = so.find3IncreasingNumbers(arr2, sizeof(arr2)/sizeof(int));
if(resultTriple.size())
cout<<"Result of arr2 : " <<resultTriple[0]<<" "<<resultTriple[1]<<" "<<resultTriple[2]<<endl;
else
cout << "Did not find increasing triple in arr2."<<endl;
resultTriple = so.find3IncreasingNumbers(arr3, sizeof(arr3)/sizeof(int));
if(resultTriple.size())
cout<<"Result of arr3 : " <<resultTriple[0]<<" "<<resultTriple[1]<<" "<<resultTriple[2]<<endl;
else
cout << "Did not find increasing triple in arr3."<<endl;
resultTriple = so.find3IncreasingNumbers(arr4, sizeof(arr4)/sizeof(int));
if(resultTriple.size())
cout<<"Result of arr4 : " <<resultTriple[0]<<" "<<resultTriple[1]<<" "<<resultTriple[2]<<endl;
else
cout << "Did not find increasing triple in arr4."<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy9GaW5kIGEgc29ydGVkIHN1YnNlcXVlbmNlIG9mIHNpemUgMyBpbiBsaW5lYXIgdGltZQpjbGFzcyBTb2x1dGlvbgp7CnByaXZhdGU6CglpbnQJc2VxMTsKCWludCBzZXEyWzJdOwoKcHVibGljOgoJdmVjdG9yPGludD4JZmluZDNJbmNyZWFzaW5nTnVtYmVycyhpbnQgKiBhcnIsIGludCBuKQoJewoJCXZlY3RvcjxpbnQ+CXJlc3VsdDsKCQlpZihuIDwgMykJcmV0dXJuIHJlc3VsdDsKCQkKCQlib29sIHNlcTJGaWxsZWQgPSBmYWxzZTsKCQlzZXExID0gYXJyWzBdOwoJCQoJCWZvcihpbnQgaSA9IDE7IGkgPCBuOyArK2kpCgkJewoJCQlpZihhcnJbaV0gPCBzZXExKQoJCQkJc2VxMSA9IGFycltpXTsKCQkJZWxzZSBpZihhcnJbaV0gPT0gc2VxMSkKCQkJCWNvbnRpbnVlOwoJCQllbHNlIGlmKCFzZXEyRmlsbGVkIHx8IGFycltpXSA8PSBzZXEyWzFdKSB7CgkJCQlzZXEyWzBdID0gc2VxMTsKCQkJCXNlcTJbMV0gPSBhcnJbaV07CgkJCQlzZXEyRmlsbGVkID0gdHJ1ZTsKCQkJfQoJCQllbHNlIHsKCQkJCXJlc3VsdC5wdXNoX2JhY2soc2VxMlswXSk7CgkJCQlyZXN1bHQucHVzaF9iYWNrKHNlcTJbMV0pOwoJCQkJcmVzdWx0LnB1c2hfYmFjayhhcnJbaV0pOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJCgkJcmV0dXJuIHJlc3VsdDsKCX0KfTsKCmludCBtYWluKCkgewoJaW50IGFycjFbXSA9IHsxMiwgMTEsIDEwLCA1LCA2LCAyLCAzMH07CglpbnQgYXJyMltdID0gezEsIDIsIDMsIDR9OwoJaW50IGFycjNbXSA9IHs0LCAzLCAxLCAyfTsKCWludCBhcnI0W10gPSB7MTIsIDExLCAxMCwgNSwgNiwgMiwgMzB9OwoJU29sdXRpb24gc287Cgl2ZWN0b3I8aW50PglyZXN1bHRUcmlwbGU7CgkKCXJlc3VsdFRyaXBsZSA9IHNvLmZpbmQzSW5jcmVhc2luZ051bWJlcnMoYXJyMSwgc2l6ZW9mKGFycjEpL3NpemVvZihpbnQpKTsKCWlmKHJlc3VsdFRyaXBsZS5zaXplKCkpCgkJY291dDw8IlJlc3VsdCBvZiBhcnIxIDogIiA8PHJlc3VsdFRyaXBsZVswXTw8IiAiPDxyZXN1bHRUcmlwbGVbMV08PCIgIjw8cmVzdWx0VHJpcGxlWzJdPDxlbmRsOwoJZWxzZQoJCWNvdXQgPDwgIkRpZCBub3QgZmluZCBpbmNyZWFzaW5nIHRyaXBsZSBpbiBhcnIxLiI8PGVuZGw7CgkKCXJlc3VsdFRyaXBsZSA9IHNvLmZpbmQzSW5jcmVhc2luZ051bWJlcnMoYXJyMiwgc2l6ZW9mKGFycjIpL3NpemVvZihpbnQpKTsKCWlmKHJlc3VsdFRyaXBsZS5zaXplKCkpCgkJY291dDw8IlJlc3VsdCBvZiBhcnIyIDogIiA8PHJlc3VsdFRyaXBsZVswXTw8IiAiPDxyZXN1bHRUcmlwbGVbMV08PCIgIjw8cmVzdWx0VHJpcGxlWzJdPDxlbmRsOwoJZWxzZQoJCWNvdXQgPDwgIkRpZCBub3QgZmluZCBpbmNyZWFzaW5nIHRyaXBsZSBpbiBhcnIyLiI8PGVuZGw7CgkJCglyZXN1bHRUcmlwbGUgPSBzby5maW5kM0luY3JlYXNpbmdOdW1iZXJzKGFycjMsIHNpemVvZihhcnIzKS9zaXplb2YoaW50KSk7CglpZihyZXN1bHRUcmlwbGUuc2l6ZSgpKQoJCWNvdXQ8PCJSZXN1bHQgb2YgYXJyMyA6ICIgPDxyZXN1bHRUcmlwbGVbMF08PCIgIjw8cmVzdWx0VHJpcGxlWzFdPDwiICI8PHJlc3VsdFRyaXBsZVsyXTw8ZW5kbDsKCWVsc2UKCQljb3V0IDw8ICJEaWQgbm90IGZpbmQgaW5jcmVhc2luZyB0cmlwbGUgaW4gYXJyMy4iPDxlbmRsOwoJCQoJcmVzdWx0VHJpcGxlID0gc28uZmluZDNJbmNyZWFzaW5nTnVtYmVycyhhcnI0LCBzaXplb2YoYXJyNCkvc2l6ZW9mKGludCkpOwoJaWYocmVzdWx0VHJpcGxlLnNpemUoKSkKCQljb3V0PDwiUmVzdWx0IG9mIGFycjQgOiAiIDw8cmVzdWx0VHJpcGxlWzBdPDwiICI8PHJlc3VsdFRyaXBsZVsxXTw8IiAiPDxyZXN1bHRUcmlwbGVbMl08PGVuZGw7CgllbHNlCgkJY291dCA8PCAiRGlkIG5vdCBmaW5kIGluY3JlYXNpbmcgdHJpcGxlIGluIGFycjQuIjw8ZW5kbDsKCQoJCglyZXR1cm4gMDsKfQ==