Pagini recente » Cod sursa (job #832819) | Cod sursa (job #2357528) | Cod sursa (job #1219418) | Cod sursa (job #1133781) | Cod sursa (job #2451352)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int inf = 0x3f3f3f3f;
int v[100005], d[100005], prec[100005], n;
stack <int> st;
int cautbin (int val){
int st = 1, dr = n;
while (st <= dr){
int mij = (st + dr) / 2;
if (v[d[mij]] >= val)
dr = mij - 1;
else
st = mij + 1;
}
return st - 1;
}
int main(){
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v[i];
v[0] = inf;
for (int i = 1; i <= n; i++){
int l = cautbin(v[i]);
if (v[i] < v[d[l + 1]]){
prec[i] = d[l];
d[l + 1] = i;
}
}
int lmax = 0, poz = 0;
for (int i = n; i >= 1; i--)
if (d[i] > 0){
lmax = i;
poz = d[i];
break;
}
fout << lmax << '\n';
while (poz){
st.push(v[poz]);
poz = prec[poz];
}
while (!st.empty()){
fout << st.top() << ' ';
st.pop();
}
fout << '\n';
return 0;
}