Pagini recente » Cod sursa (job #1690523) | Cod sursa (job #3135507) | Cod sursa (job #2204452) | Cod sursa (job #3132278) | Cod sursa (job #2573901)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int aib[100005];
int d[100005];
int r[100005];
int n;
struct no
{
int val , poz, no;
}v[100005];
int len(int x)
{
return x & -x;
}
int q(int poz)
{
int maxim = 0;
while(poz)
{
maxim = max(maxim , aib[poz]);
poz -= len(poz);
}
return maxim;
}
int u(int poz , int val)
{
while(poz <= n)
{
aib[poz] = max(aib[poz] , val);
poz += len(poz);
}
}
bool xort1(no a , no b)
{
if(a.val < b.val)
return true;
return false;
}
void nor()
{
int ac = 0;
v[0].val = -1;
for(int i = 1; i <= n; i++)
{ac += (v[i - 1].val != v[i].val);
v[i].no = ac;}
}
bool xort2(no a , no b)
{
if(a.poz < b.poz)
return true;
return false;
}
int main()
{
int i , best = 0 , rez , last;
cin >> n;
for(i = 1; i <= n; i++)
{
cin >> v[i].val;
v[i].poz = i;
}
sort( v + 1, v + n + 1, xort1);
nor();
sort(v + 1, v + n + 1, xort2);
for(i = 1; i <= n; i++)
{
d[i] = q(v[i].no - 1) + 1;
best = max(best , d[i]);
u(v[i].no , d[i]);
}
cout << best << '\n';
rez = best;
last = 0;
v[last].val = 2000000005;
for(i = n; i >= 1 && best; i--)
{
if(d[i] == best && v[i].val < v[last].val)
r[best--] = v[i].val , last = i;
}
for(i = 1; i <= rez; i++)
cout << r[i] << " ";
return 0;
}