Pagini recente » Cod sursa (job #660721) | Cod sursa (job #394591) | Cod sursa (job #109418) | Cod sursa (job #1252993) | Cod sursa (job #2285288)
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
struct pair_compare {
bool operator() (const std::pair<int,int> & p1, const std::pair<int,int> & p2) const {
if(p1.first == p2.first)
return (p1.second < p2.second);
else
return (p1.first < p2.first);
}
};
#define MAXN 100000
set<pair<int,int>,pair_compare> S;
int N;
int V[MAXN];
int B[MAXN];
int P[MAXN];
int main(){
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d",&N);
set<pair<int,int>,pair_compare>::iterator it;
int lung=1,pozbest=0;
for(int i=0;i<N;i++){
scanf("%d", &V[i]);
S.insert(make_pair(V[i],i));
B[i]=1;
P[i]=-1;
for(it=S.begin();it->first<V[i];it++){
if((B[it->second]+1)>B[i]){
B[i]=B[it->second]+1;
P[i]=it->second;
}
}
if(B[i]>lung){
lung=B[i];
pozbest=i;
}
}
printf("%d\n",lung);
int lung1=lung;
int* pozitii=new int[lung];
while(pozbest!=-1){
lung--;
pozitii[lung]=pozbest;
pozbest=P[pozbest];
}
for(int i=0;i<lung1;i++)
printf("%d ",V[pozitii[i]]);
return 0;
}