Pagini recente » Cod sursa (job #677394) | Cod sursa (job #777069) | Cod sursa (job #808319) | Cod sursa (job #451382) | Cod sursa (job #3322376)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[100005];
const int INF=2e9+1;
vector<int> dp;
int cautbin(int val)
{
int st = 0, dr = dp.size()-1;
int rez=dp.size();
while(st<=dr)
{
int mij = (st+dr)/2;
if(dp[mij] >= val)
{
dr=mij-1;
rez=mij;
}
else
st=mij+1;
}
return rez;
}
int poz[100005];
int lant[100005];
int main()
{
int n;
fin >> n;
for(int i=1; i <= n; i++)
fin >> v[i];
for(int i=1; i <= n; i++)
{
int it = cautbin(v[i]);
if(it==dp.size())
dp.push_back(v[i]);
else
dp[it]=v[i];
poz[it]=i;
if(it>0)
lant[i]=poz[it-1];
}
vector<int> afis;
fout << dp.size() << '\n';
int root = poz[dp.size()-1];
while(root)
{
afis.push_back(v[root]);
root = lant[root];
}
reverse(afis.begin(), afis.end());
for(auto I : afis)
fout << I << " ";
return 0;
}