Pagini recente » Cod sursa (job #2553203) | Cod sursa (job #2831461) | Cod sursa (job #2198303) | Cod sursa (job #187149) | Cod sursa (job #3253734)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[100001];
int poz[100001];
int s[100001],l;
int sol[100001];
void bi_search(int i) {
if(v[i]<=s[1]){ s[1]=v[i]; poz[i]=1;}
else if(v[i]> s[l]){
s[l + 1] = v[i]; poz[i] = l + 1;
l ++;
}
else {
int st = 1, dr = l;
while(st + 1 < dr) {
int mij = (st + dr) / 2;
if(v[i] <= s[mij])
dr = mij;
else
st = mij;
}
s[dr] = v[i], poz[i] = dr;
}
}
int main(){
int n;
fin >> n;
for(int i = 1 ; i <= n ; i++)
{
fin >> v[i];
}
s[1]=v[1];
poz[1]=1; l=1;
for (int i = 2; i <= n; i++)
{
bi_search(i);
}
fout<<l<<endl;
int lc = l;
// v[1]..................v[n]
//poz[1]...............poz[n]
sol[l+1]= 2000000001;
for (int i = n; i >= 1; i--)
if (poz[i] == l && v[i]<sol[l+1] )
{
sol[l] = v[i];
l--;
}
for (int i = 1; i <= lc; i++)
fout << sol[i] << ' ';
return 0;
}