Pagini recente » Cod sursa (job #1478382) | Cod sursa (job #2082998) | Cod sursa (job #1915425) | Cod sursa (job #2527893) | Cod sursa (job #2737893)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX(100005);
int v[NMAX], scm[NMAX], nr, in[NMAX], sol[NMAX];
void adauga(int val, int poz){
if(val > scm[nr]){
scm[++nr] = val;
in[poz] = nr;
return;
}
int step = 1, best = 0;
for(; step <= nr; step <<= 1);
for(; step; step >>= 1)
if(best + step <= nr && scm[best + step] < val)
best += step;
++best;
scm[best] = val;
in[poz] = best;
}
int main()
{
int n;
fin >> n;
for(int i = 1; i <= n; ++i)
fin >> v[i];
for(int i = 1; i <= n; ++i)
adauga(v[i], i);
int p = n;
for(int i = nr; i >= 1; --i){
while(in[p] != i)
p--;
sol[i] = p;
}
fout << nr << '\n';
for(int i = 1; i <= nr; ++i)
fout << v[sol[i]] << ' ';
return 0;
}