Pagini recente » Cod sursa (job #1956968) | Cod sursa (job #1237963) | Cod sursa (job #1592904) | Monitorul de evaluare | Cod sursa (job #2022338)
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, a[100002];
int lis;
int d[100002]; ///d[i] - ultimul element al lisului cu i elemente
int poz[100002];
int cautbin(int nr, int b, int e)
{
int mid = (b + e)/2;
while(b < e)
{
mid = (b + e)/2;
if(d[mid] >= nr)
e = mid;
else
b = mid + 1;
}
return b;
}
int main()
{
ifstream in ("scmax.in");
ofstream out ("scmax.out");
int lo;
in>>n;
for(int i = 0; i < n; ++i)
in>>a[i];
lis=1;
d[lis]=a[0];
for (int i=1; i < n; ++i)
{
if(a[i] > d[lis])
{
++lis;
d[lis] = a[i];
poz[lis]=d[lis-1];
}
else
{
// cout<<"Caut in 1, "<<lis<<"...\n";
lo=cautbin(a[i], 1, lis);
d[lo]=a[i];
// cout<<"Pun pe d("<<lo<<") "<<a[i]<<"\n";
}
//for (int j=1; j <= 6; ++j)
// cout<<d[j]<<" ";
//cout<<"\n";
}
//for (int j=1; j <= 6; ++j)
// cout<<d[j]<<" ";
//cout<<"\n";
//cout<<lis<<"\n";
//for(int i=2;i<=lis;++i)
// cout<<poz[i]<<" ";
//cout<<d[lis]<<" ";
out<<lis<<"\n";
for(int i=2;i<=lis;++i)
out<<poz[i]<<" ";
out<<d[lis]<<" ";
return 0;
}