Pagini recente » Cod sursa (job #1817878) | Cod sursa (job #58020) | Cod sursa (job #1655693) | Cod sursa (job #2877731) | Cod sursa (job #2578229)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,a[100001],Poz[100001];
int arb[100001],h,tree[100001];
int val[100001],urm[100001];
int sol[100001],t;
int findBin(int val)
{
int poz=0;
for(int p=h;p;p/=2)
if(poz+p<=h && arb[poz+p]<=val)
poz+=p;
return poz;
}
int maxim(int poz)
{
int P=tree[poz];
while(poz)
{
if(val[ tree[poz] ]>val[P])
P=tree[poz];
poz-=poz&-poz;
}
return P;
}
void update(int poz,int i)
{
while(poz<=h && val[ tree[poz] ]<=val[i])
{
tree[poz]=i;
poz+=poz&-poz;
}
}
int main()
{
in>>n;
for(int i=1;i<=n;i++)
in>>a[i];
for(int i=1;i<=n;i++)
arb[i]=a[i];
sort(arb+1,arb+1+n);
h=1;
for(int i=2;i<=n;i++)
if(arb[h]!=arb[i])
arb[++h]=arb[i];
for(int i=1;i<=n;i++)
Poz[i]=findBin(a[i]);
for(int i=1;i<=n;i++)
{
urm[i]=maxim(Poz[i]-1);
if(urm[i])
val[i]=val[ urm[i] ]+1;
update(Poz[i],i);
}
int maxim=1;
for(int i=2;i<=n;i++)
if(val[maxim]<val[i])
maxim=i;
else if(val[maxim]==val[i] && a[maxim]>a[i])
maxim=i;
while(maxim)
{
sol[++t]=a[maxim];
maxim=urm[maxim];
}
out<<t<<'\n';
for(int i=t;i>=1;i--)
out<<sol[i]<<' ';
return 0;
}