Pagini recente » Cod sursa (job #1424236) | Cod sursa (job #2295386) | Cod sursa (job #343786) | Cod sursa (job #970172) | Cod sursa (job #2916984)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int maxN = 100005;
int v[maxN], p[maxN], dp[maxN];
void traseu (int k, int n) {
if(k == 1 && p[n] == 1)
fout << v[n] << " ";
else if(p[n] == k) {
traseu(k-1, n-1);
fout << v[n] << " ";
} else {
traseu(k, n-1);
}
}
int main()
{
int n; fin >> n;
for(int i = 1; i <= n; ++i)
fin >> v[i];
int k = 0;
for(int i = 1; i <= n; ++i) {
if(v[i] > dp[k]) {
dp[++k] = v[i];
p[i] = k;
} else {
int st = 1, dr = k, poz = -1;
while(st <= dr) {
int mij = (st + dr) / 2;
if(v[i] <= dp[mij]) {
poz = mij;
dr = mij - 1;
} else
st = mij + 1;
}
dp[poz] = v[i];
p[i] = poz;
}
}
fout << k << "\n";
traseu(k, n);
return 0;
}