Pagini recente » Cod sursa (job #2050733) | Monitorul de evaluare | Cod sursa (job #1710225) | Rating Alexander Stewart (6evanc1391we2) | Cod sursa (job #2868971)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
using ll = long long;
const int NMAX(100005);
int v[NMAX], nr, scm[NMAX], dUnd[NMAX], rez[NMAX];
inline void adauga(int val, int pz){
if(scm[nr] < val){
scm[++nr] = val;
dUnd[pz] = nr;
return;
}
int step = 1;
for(; step <= nr; step <<= 1);
step >>= 1;
int best = 0;
for(; step; step >>= 1)
if(best + step <= nr && scm[best + step] < val)
best += step;
++best;
scm[best] = val;
dUnd[pz] = best;
}
int main()
{
int n;
fin >> n;
for(int i = 1; i <= n; ++i){
fin >> v[i];
adauga(v[i], i);
}
int elem = n;
for(int i = nr; i >= 1; --i){
while(dUnd[elem] != i)
--elem;
rez[i] = v[elem];
}
fout << nr << '\n';
for(int i = 1; i <= nr; ++i)
fout << rez[i] << ' ';
return 0;
}