Pagini recente » Cod sursa (job #250489) | Cod sursa (job #1156507) | Cod sursa (job #427213) | Istoria paginii utilizator/zasz | Cod sursa (job #2737891)
#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(nr == 0){
scm[++nr] = val;
in[poz] = nr;
return;
}
if(val > scm[nr]){
scm[++nr] = val;
in[poz] = nr;
return;
}
if(val < scm[1]){
scm[1] = val;
in[poz] = 1;
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;
}