Pagini recente » Cod sursa (job #2610764) | Cod sursa (job #2913799) | Cod sursa (job #1669412) | Cod sursa (job #2171757) | Cod sursa (job #2470318)
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")
#include <bits/stdc++.h>
using namespace std;
#define lsb(x) (x&(-x))
static const int NMAX = 1e5+5;
int aib[NMAX];
int v[NMAX];
int unique_id[NMAX];
int previous[NMAX];
int sol[NMAX];
int n;
int query(int position)
{
int mx = 0;
for(int i = position; i>= 1; i-=lsb(i))
{
mx = max(mx, aib[i]);
}
return mx;
}
void update(int position, int value)
{
for(int i = position;i<=n; i+=lsb(i))
{
aib[i] = max(aib[i],value);
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
map<int,int> unique;
for(int i = 1; i<=n; ++i)
{
cin >> v[i];
unique[v[i]] = 0;
}
int k = 0;
for(auto it = unique.begin(); it!= unique.end(); it++)
{
k++;
unique[it->first] = k;
}
for(int i =1; i<=n; ++i)
{
// Gasesc suma cea mai mare pt elemente mai mici decat elem curent
int max_length = query(unique[v[i]]-1);
update(unique[v[i]],max_length + 1);
sol[max_length+1] = v[i];
}
int sz = query(n);
cout << sz << '\n';
for(int i = 1; i<= sz;++i)
cout <<sol[i] << " ";
return 0;
}