Pagini recente » Cod sursa (job #1189855) | Cod sursa (job #2667008) | Cod sursa (job #1933682) | Cod sursa (job #1100301) | Cod sursa (job #3166008)
#include <fstream>
#include <algorithm>
#include <unordered_map>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
struct el
{
int nr,poz;
};
el aib[100001];
int frr[100001],i,maxc,n,poz,nr,pozi,x[100001],v[100001],t[100001];
unordered_map <int,int> fr;
void f (int x)
{
if (x!=0)
{
f (t[x]);
fout<<frr[x]<<" ";
}
}
void query (int i)
{
for (; i>0; i-=(i&-i))
{
if (aib[i].nr>nr)
{
nr=aib[i].nr;
pozi=aib[i].poz;
}
}
}
void update (int i,int val)
{
int poz=i;
for (; i<=n; i+=(i&-i))
{
if (val>aib[i].nr)
{
aib[i].nr=val;
aib[i].poz=poz;
}
}
}
int main ()
{
fin>>n;
for (i=1; i<=n; i++)
{
fin>>v[i];
x[i]=v[i];
}
sort (x+1,x+n+1);
fr[x[1]]=++nr;
frr[nr]=x[1];
for (i=2; i<=n; i++)
{
if (x[i]!=x[i-1])
{
fr[x[i]]=++nr;
frr[nr]=x[i];
}
}
for (i=1; i<=n; i++)
{
v[i]=fr[v[i]];
nr=pozi=0;
query (v[i]-1);
if (nr+1>maxc)
{
maxc=nr+1;
poz=v[i];
}
update (v[i],nr+1);
t[v[i]]=pozi;
}
fout<<maxc<<"\n";
f (poz);
return 0;
}