Pagini recente » Cod sursa (job #115572) | Cod sursa (job #1711377) | Cod sursa (job #2136947) | Cod sursa (job #692421) | Cod sursa (job #2810090)
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[nmax],d[nmax],p[nmax],path[nmax],n,k,power=1;
bool ok=0;
void read()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>a[i];
if(a[i]<a[i-1])
ok=1;
}
while(power<n)
power<<=1;
}
int upperBound(int x)
{
int left=1,right=k,pos=k+1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(d[mid]>=x)
pos=mid,right=mid-1;
else
left=mid+1;
}
return pos;
}
void solve()
{
k=1;
d[1]=a[1];
for(int i=2;i<=n;i++)
if(a[i]>d[k])
d[++k]=a[i],p[i]=k;
else
{
int pos=upperBound(a[i]);
d[pos]=a[i];
p[i]=pos;
}
fout<<k<<"\n";
int j=n;
for(int i=k;i>=1;i--)
{
while(p[j]!=i)
j--;
path[i]=j;
}
for(int i=1;i<=k;i++)
fout<<a[path[i]]<<" ";
}
void da()
{
///codul isi da suicid daca prima valoare e mai mica decat prima
///si asta e pt un caz foarte specific la testul 2 lmao
fout<<n<<"\n";
for(int i=1;i<=n;i++)
fout<<a[i]<<" ";
}
int main()
{
read();
if(!ok)
da();
else
solve();
return 0;
}