Pagini recente » Cod sursa (job #228039) | Cod sursa (job #2963564) | Cod sursa (job #1238554) | Cod sursa (job #2473374) | Cod sursa (job #1040192)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#define zeros(x) x&(x-1)^x
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, v[1000], sortat[10000], d[10000], aib[10000];
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[x]);
}
}
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(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);
for(int i=1; i<=n; ++i)
h[sortat[i]]=i;
scmax();
int mx=0, pmx;
for(int i=1; i<=n; ++i){
if(d[i]>mx) mx=d[i], pmx=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;
}