Pagini recente » Cod sursa (job #919200) | Cod sursa (job #2452778) | Cod sursa (job #2654126) | Cod sursa (job #825441) | Cod sursa (job #1040203)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <cstring>
#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]<<' ';
}
char s[100000000];
void citire(){
f>>n; f.get();
int j=1;
f.getline(s, 10000001); int x=0;
int len=strlen(s);
for(int as=0; as<len; ++as)
if(s[as]==' ')
{
v[j]=sortat[j]=x; ++j;
//cout<<x<<' ';
x=0;
}
else{
x=10*x+(s[as]-'0');
}
//v[j]=sortat[j]=x;
}
int main()
{
// f>>n;
// for(int i=1; i<=n; ++i)
// f>>v[i], sortat[i]=v[i];
citire();
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;
}