Pagini recente » Cod sursa (job #783627) | Cod sursa (job #1638245) | Cod sursa (job #1970058) | Cod sursa (job #983825) | Cod sursa (job #2041453)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
///Solutie O(nlogn)
const int NMAX=100001;
int a[NMAX],st[NMAX],poz[NMAX],n,top;
inline int CB(int x)
{
int stg=1,drp=top,mij,poz=1;
while(stg<=drp)
{
mij=(stg+drp)/2;
if(st[mij]>=x)
{
poz=mij;
drp=mij-1;
}
else stg=mij+1;
}
return poz;
}
inline void Solve()
{
top=1;
int x,y;
x=a[top];
st[top]=x;
poz[top]=1;
for(int i=2;i<=n;i++)
{
x=a[i];
if(x<=st[1])
{
st[1]=x;
poz[i]=1;
}
else if(x>st[top])
{
st[++top]=x;
poz[i]=top;
}
else
{
y=CB(x);
st[y]=x;
poz[i]=y;
}
}
int mx=1;
for(int i=1;i<=n;i++)
mx=max(mx,poz[i]);
fout<<mx<<"\n";
int pas,mn,p,k;
k=1;
pas=0;
while(k<=mx)
{
mn=LONG_MAX;
for(int i=pas+1;i<=n;i++)
if(mn>a[i] && poz[i]==k)
{
mn=a[i];
p=i;
}
fout<<mn<<" ";
k++;
pas=p;
}
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>a[i];
Solve();
fin.close();
fout.close();
return 0;
}