Pagini recente » Cod sursa (job #2361258) | Cod sursa (job #2010966) | Istoria paginii runda/oji_2020_cls10/clasament | Cod sursa (job #1547847) | Cod sursa (job #906129)
Cod sursa(job #906129)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
int n;
int size = 0;
int main(){
int x;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
v.push_back(0);
for(int i=0;i<n;i++){
scanf("%d",&x);v.push_back(x);
}
vector<int> a(100005);
vector<int> poz(100005);
vector<int> prev(100005);
a[0]=0;
poz[0]=0;
int maxPoz = 0;
for(int i=1;i<=n;i++){
vector<int> ::iterator it = upper_bound(a.begin(),a.begin()+size+1,v[i]);
if(it-a.begin()==(size+1) && a[size]!=v[i]){
size++;
maxPoz = i;
}
a[(it-a.begin())]=v[i];
poz[(it-a.begin())]=i;
prev[i]=poz[it-a.begin()-1];
}
printf("%d\n",size);
vector<int> ans;
while(maxPoz !=0){
ans.push_back(maxPoz);
maxPoz = prev[maxPoz];
}
for(int i=size-1;i>=0;i--)
printf ("%d ",v[ans[i]]);
return 0;
}