Pagini recente » Cod sursa (job #2597264) | Cod sursa (job #1749070) | Cod sursa (job #1526123) | Cod sursa (job #2496258) | Cod sursa (job #547847)
Cod sursa(job #547847)
#include<stdio.h>
#include<vector>
#include<algorithm>
#define dmax 100003
using namespace std;
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]);
printf("%d ", 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()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i;
scanf("%d", &n);
for(i=1;i<=n;i++)
{
scanf("%d", &x[i]);
v.push_back(x[i]);
}
norm();
for(i=1;i<=n;i++)
{
scm[i] = query(i)+1;
update(i);
if(scm[i] > m)
{ m=scm[i];
ult=i;
}
}
printf("%d\n", m);
getsol(ult);
printf("%d", x[ult]);
return 0;
}