Pagini recente » Cod sursa (job #2795708) | Cod sursa (job #898315) | Cod sursa (job #2610241) | Cod sursa (job #2528326) | Cod sursa (job #1181321)
#include <fstream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAX_N=100100;
int v[MAX_N];
int d[MAX_N];
bool viz[MAX_N];
vector<int> a;
int aib[MAX_N];
int n;
map<int,int> M;
void update(int poz, int val) {
while ( poz <= n ) {
if(d[aib[poz]]<d[val]) {
aib[poz]=val;
}
poz += ( poz & ( -poz ) );
}
}
int query(int poz) {
int ans=0;
while( poz ) {
if(d[aib[poz]]>d[ans]) {
ans=aib[poz];
}
poz -= ( poz & ( -poz ) );
}
return ans;
}
void norm() {
sort(a.begin(),a.end());
a.erase(unique(a.begin(),a.end()),a.end());
int cat=0;
for(auto it:a) {
M[it]=++cat;
}
for(int i=1;i<=n;i++) {
v[i]=M[v[i]];
}
}
int main() {
fin>>n;
for( int i=1; i<=n; i++) {
fin >> v[i];
a.push_back(v[i]);
}
norm();
int poz=0;
for(int i=1;i<=n;i++) {
d[i]=d[query(v[i]-1)]+1;
if(d[i]>d[poz]) {
poz=i;
}
if(!viz[v[i]]) {
update(v[i],i);
}
}
fout << d[poz]<<'\n';
vector<int> sol;
sol.push_back(v[poz]);
for(int i=poz-1; i>=1 && d[poz]>1; i--) {
if( d[i]+1 == d[poz] && v[i] < v[poz] ) {
poz=i;
sol.push_back(v[poz]);
}
}
reverse(sol.begin(), sol.end());
for(auto it=sol.begin(); it!=sol.end(); it++) {
fout<<a[*it-1]<<' ';
}
return 0;
}