Pagini recente » Cod sursa (job #1872487) | Cod sursa (job #1215617) | Cod sursa (job #2036948) | Cod sursa (job #161042) | Cod sursa (job #1040200)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#define zeros(x) x&(-x)
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, v[100002], sortat[100002], d[100002], aib[100002];
unordered_map<int, int> h;
void update(int poz, int x){
for(int i=poz; i<=n; i+=zeros(i)){
aib[i]=max(x, aib[i]);
}
}
int query(int poz){
int mx=0;
for(int i=poz; i>0; i-=zeros(i)){
mx=max(mx, aib[i]);
}
return mx;
}
void scmax(){
int mx=0;
for(int i=1; i<=n; ++i){
mx=query(h[v[i]]-1);
d[i]=mx+1;
update(h[v[i]],d[i]);
}
}
void sir(int p, int mx){
if(!p||!mx) return;
int t=0;
if(d[p]==mx) mx--, t=1;
sir(p-1, mx);
if(t) g<<v[p]<<' ';
}
int main()
{
f>>n;
for(int i=1; i<=n; ++i)
f>>v[i], sortat[i]=v[i];
sort(sortat+1, sortat+n+1);
int k=0;
for(int i=1; i<=n; ++i)
if(!h[sortat[i]]) h[sortat[i]]=i-k;
else k++;
scmax();
int mx=0, pmx;
for(int i=1; i<=n; ++i){
if(d[i]>mx) mx=d[i], pmx=i;
//cout<<h[v[i]]<<' ';
}
g<<mx<<'\n';
sir(pmx, mx);
// for(int i=pmx; i>0&&mx; --i)
// if(d[i]==mx) g<<v[i]<<' ', mx--;
return 0;
}