Pagini recente » Cod sursa (job #1894332) | Cod sursa (job #1788952) | Cod sursa (job #1329248) | Cod sursa (job #698028) | Cod sursa (job #547834)
Cod sursa(job #547834)
#include<fstream>
#include<vector>
#include<algorithm>
#define dmax 100003
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,x[dmax],aib[dmax],scm[dmax],m,pre[dmax],y[dmax],ult;
vector<int>v;
vector<int>::iterator it,ne;
void getsol(int k)
{
if(pre[k]!=0)
{ getsol(pre[k]);
out<<x[pre[k]]<<" ";
}
}
void norm()
{ int i;
sort(v.begin(), v.end() );
ne=unique(v.begin(), v.end() );
v.erase(ne, v.end() );
}
void update(int k)
{
int poz=k;
it=lower_bound(v.begin(), v.end(), x[k]);
poz=it-v.begin()+1;
aib[poz]=scm[k];
y[poz]=k;
while(poz < n && poz < dmax)
{
poz+=(poz & -poz);
if( (aib[poz]==0 || aib[poz] < scm[k]) && poz < dmax)
{ aib[poz]=scm[k];
y[poz]=k;
}
}
}
int query(int k)
{
int poz, mx;
it=lower_bound(v.begin(), v.end(), x[k]);
poz=it-v.begin();
mx=aib[poz];
pre[k]=y[poz];
while(poz > 0)
{
poz-=(poz & -poz);
if(aib[poz] > mx)
{ mx=aib[poz];
pre[k]=y[poz];
}
}
return mx;
}
int main()
{
int i;
in>>n;
for(i=1;i<=n;i++)
{
in>>x[i];
v.push_back(x[i]);
}
in.close();
norm();
for(i=1;i<=n;i++)
{
scm[i] = query(i)+1;
update(i);
}
for(i=1;i<=n;i++)
{ if(scm[i] > m)
{ m=scm[i];
ult=i;
}
}
out<<m<<'\n';
getsol(ult);
out<<x[ult];
out.close();
return 0;
}