Pagini recente » Istoria paginii utilizator/ucv_nicola_radulescu_vladutu | Cod sursa (job #1542230) | Cod sursa (job #1832679) | Cod sursa (job #334348) | Cod sursa (job #744559)
Cod sursa(job #744559)
#include <fstream>
#include <cstring>
#include <algorithm>
#define maxN 131072
#define lsb(x) ((-x)&x)
using namespace std;
ifstream in;
ofstream out;
int v[maxN];
struct two
{
int v,p;
}aux[maxN];
int norm[maxN];
int d[maxN];
int aib[maxN];
int t[maxN];
inline bool cmp(const two &a,const two &b)
{
return a.v<b.v;
}
inline int query(int idx)
{
int ret=0;
for(;idx>0;idx-=lsb(idx))
if(d[aib[idx]]>d[ret])
ret=aib[idx];
return ret;
}
inline void update(int idx,int val)
{
for(;idx<maxN;idx+=lsb(idx))
if(d[aib[idx]]<d[val])
aib[idx]=val;
}
int main()
{
int N;
in.open("scmax.in");
in>>N;
for(int i=1;i<=N;++i)
in>>v[i];
in.close();
for(int i=1;i<=N;++i)
{
aux[i].v=v[i];
aux[i].p=i;
}
sort(aux+1,aux+N+1,cmp);
norm[aux[1].p]=1;
for(int i=2;i<=N;++i)
{
norm[aux[i].p]=norm[aux[i-1].p];
if(aux[i].v!=aux[i-1].v) ++norm[aux[i].p];
}
memset(d,0,sizeof(d));
memset(aib,0,sizeof(aib));
int sol=0;
for(int i=1;i<=N;++i)
{
t[i]=query(norm[i]-1);
d[i]=1+d[t[i]];
update(norm[i],i);
if(d[sol]<d[i]) sol=i;
}
out.open("scmax.out");
out<<d[sol]<<'\n';
memset(norm,0,sizeof(norm));
for(int x=sol;x;x=t[x])
norm[++norm[0]]=v[x];
for(int i=norm[0];i>0;--i)
out<<norm[i]<<' ';
out<<'\n';
out.close();
return 0;
}