Pagini recente » Cod sursa (job #871123) | Cod sursa (job #2385068) | Cod sursa (job #2056387) | Profil Kopac13 | Cod sursa (job #1804864)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> norm;
int v[100010],d[100010],tata[100010],sol[100010],aib[100010],n;
int poz_norm(int x)
{
return lower_bound(norm.begin(),norm.end(),x)-norm.begin()+1;
}
void aib_update(int i,int poz)
{
for(;i<=n;i+=i&(-i))
if(d[poz]>d[aib[i]]) aib[i]=poz;
}
int aib_query(int i)
{
int poz=0;
for(;i>0;i-=i&(-i))
if(d[aib[i]]>d[poz]) poz=aib[i];
return poz;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>v[i];
norm.push_back(v[i]);
}
sort(norm.begin(),norm.end());
for(int i=1;i<=n;i++)
{
int a=poz_norm(v[i]);
int poz=aib_query(a-1);
d[i]=d[poz]+1;
tata[i]=poz;
aib_update(a,i);
}
int poz=0,nr=0;
for(int i=1;i<=n;i++)
if(d[i]>d[poz]) poz=i;
for(int i=poz;i>0;i=tata[i]) sol[++nr]=v[i];
fout<<nr<<"\n";
for(int i=nr;i;i--) fout<<sol<<" ";
return 0;
}