Pagini recente » Cod sursa (job #1301784) | Cod sursa (job #421841) | Cod sursa (job #1141266) | Cod sursa (job #242004) | Cod sursa (job #547855)
Cod sursa(job #547855)
#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,z[dmax];
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()
{
sort(v.begin(), v.end() );
ne=unique(v.begin(), v.end() );
v.erase(ne, v.end() );
}
void update(int k)
{
int poz;
poz=z[k]+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;
poz=z[k];
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++)
{ it=lower_bound(v.begin(), v.end(), x[i]);
z[i]=it-v.begin();
}
for(i=1;i<=n;i++)
{
scm[i] = query(i)+1;
update(i);
if(scm[i] > m)
{ m=scm[i];
ult=i;
}
}
out<<m<<'\n';
getsol(ult);
out<<x[ult];
out.close();
return 0;
}