Pagini recente » Cod sursa (job #1671155) | Cod sursa (job #1013402) | Cod sursa (job #600959) | Cod sursa (job #3177755) | Cod sursa (job #546178)
Cod sursa(job #546178)
#include<fstream>
#include<algorithm>
#define dmax 100003
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,x[dmax],y[dmax],poz[dmax],scm[dmax],aib[dmax],r,pre[dmax],sir[dmax],ult,z[dmax];
int sf(int a, int b)
{
return (x[a] < x[b]);
}
void update(int k)
{ int p,s;
p=scm[k];
s=k;
aib[poz[k]]=p;
pre[poz[k]]=s;
k=poz[k];
while(k < n)
{
k+=(k & -k);
if(aib[k] < p || aib[k]==0)
{ aib[k] = p;
pre[k] = s;
}
}
}
int query(int k)
{
int mx=0,f,s;
s = k;
mx = aib[z[poz[k]]];
f = pre[z[poz[k]]];
k = z[poz[k]];
while(k > 0)
{
k-=(k & -k);
if(aib[k] > mx)
{ mx=aib[k];
f = pre[k];
}
}
sir[s]=f;
return mx;
}
void getsol(int k)
{
if(sir[k]!=0)
{ getsol(sir[k]);
out<<x[sir[k]]<<" ";
}
}
int main()
{
int i;
in>>n;
for(i=1;i<=n;i++)
{ in>>x[i];
y[i]=i;
}
in.close();
sort(y+1, y+n+1, sf );
for(i=1;i<=n;i++)
poz[y[i]]=i;
for(i=2;i<=n;i++)
if(x[y[i]] != x[y[i-1]])
z[i]=i-1;
else z[i]=z[i-1];
for(i=1;i<=n;i++)
{ scm[i]=query(i) + 1;
update(i);
}
for(i=1;i<=n;i++)
if(scm[i] > r)
{ r = scm[i];
ult = i;
}
out<<r<<'\n';
getsol(ult);
out<<x[ult];
out.close();
return 0;
}