Pagini recente » Cod sursa (job #1435018) | Cod sursa (job #2387163) | Cod sursa (job #353217) | Cod sursa (job #1012052) | Cod sursa (job #2174729)
#include <iostream>
#include <fstream>
#define maxN 100005
#include <queue>
#include <stack>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
long long v[maxN], n, poz, pre[maxN], trv[maxN], tri[maxN];
stack <int> st;
int binar (int left, int right, int x) {
int mid = (left + right)/2;
if (left <= right) {
if (trv[mid] < x) {
return binar(mid+1, right, x);
}
else
return binar(left, mid-1, x);
}
return mid;
}
int main () {
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
}
trv[1] = v[1];
tri[1] = 1;
int MAXL = 1;
for (int i = 2; i <= n; ++i) {
poz = binar(1, MAXL, v[i]);
if (poz == MAXL) {
MAXL++;
}
trv[poz+1] = v[i];
tri[poz+1] = i;
pre[i] = tri[poz];
}
fout << MAXL << '\n';
int p = tri[MAXL];
while (p) {
st.push(v[p]);
p = pre[p];
}
while (!st.empty()) {
fout << st.top() << " ";
st.pop();
}
}