#include
using namespace std;
int getValue(deque d, list temp) {
if (d.size() < 2)
return d.size();
temp.emplace_back(d[0]);
for (int i = 1; i < d.size(); i++)
if (d[i] > *(--temp.end())) temp.emplace_back(d[i]);
else {
auto it = lower_bound(temp.begin(), temp.end(), d[i]);
auto iter = temp.erase(it);
temp.insert(iter, d[i]);
}
return temp.size();
}
void final(deque d, list temp) {
int maxLen = getValue(d, temp);
temp.emplace_back(d[0]);
for (int i = 1; i < d.size(); i++)
if (d[i] > *(--temp.end())) {
temp.emplace_back(d[i]);
if (temp.size() == maxLen)break;
} else {
auto it = lower_bound(temp.begin(), temp.end(), d[i]);
auto iter = temp.erase(it);
temp.insert(iter, d[i]);
}
for (auto it:temp)
printf("%d ", it);
}
int main() {
deque d;
int num;
while (scanf("%d", &num), num)
d.emplace_back(num);
list temp;
//temp数组,d{2,1,5,3,6,4,8,9,7}
//temp[i]即从d数组中选取i+1个元素构成递增序列(必须从小到大选,可跳过的选择)
//假设此时i为2,则会有很多种排列方式(递增序列)
//则temp[i]的值为(所有排列(在i为2的条件下)中最右端的元素(即每种排列方式的最右端数据即最大的数据)) 最小的元素
//则i为2时有以下几种排列方式
//2 5 6, 2 5 8, 2 5 9, 2 5 7
//1 5 6, 1 5 8, 1 5 9, 1 5 7
//2 3 6, 2 3 4, 2 3 8, 2 3 9, 2 3 7
//1 3 6, 1 3 4, 1 3 8, 1 3 9, 1 3 7
//则所有最右端数据有6,8,9,7,4
//所以temp[2]=4
//temp[0]即为一个元素的最小值
final(d, temp);
return 0;
}
#include
using namespace std;
int getValue(deque d, int *temp) {
if (d.size() < 2)
return d.size();
temp[0] = d[0];
int len = 1;
for (int i = 1; i < d.size(); i++)
d[i] > temp[len - 1] ? temp[len++] = d[i] : ({
int index = lower_bound(temp, temp + len, d[i]) - temp;
temp[index] = d[i];
});
return len;
}
void final(deque d, int *temp) {
int maxLen = getValue(d, temp);
temp[0] = d[0];
int len = 1;
for (int i = 1; i < d.size(); i++)
if (d[i] > temp[len - 1]) {
temp[len++] = d[i];
if (len == maxLen)
break;
} else {
int index = lower_bound(temp, temp + len, d[i]) - temp;
temp[index] = d[i];
}
for (int i = 0; i < len; i++)
printf("%d ", temp[i]);
}
int main() {
deque d;
int num;
while (scanf("%d", &num), num)
d.emplace_back(num);
int temp[d.size()];
//temp数组,d{2,1,5,3,6,4,8,9,7}
//temp[i]即从d数组中选取i+1个元素构成递增序列(必须从小到大选,可跳过的选择)
//假设此时i为2,则会有很多种排列方式(递增序列)
//则temp[i]的值为(所有排列(在i为2的条件下)中最右端的元素(即每种排列方式的最右端数据即最大的数据)) 最小的元素
//则i为2时有以下几种排列方式
//2 5 6, 2 5 8, 2 5 9, 2 5 7
//1 5 6, 1 5 8, 1 5 9, 1 5 7
//2 3 6, 2 3 4, 2 3 8, 2 3 9, 2 3 7
//1 3 6, 1 3 4, 1 3 8, 1 3 9, 1 3 7
//则所有最右端数据有6,8,9,7,4
//所以temp[2]=4
//temp[0]即为一个元素的最小值
final(d, temp);
return 0;
}