Pagini recente » Cod sursa (job #3270793) | Cod sursa (job #881203) | Cod sursa (job #3265617) | Cod sursa (job #2421827) | Cod sursa (job #3000458)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int dim = 1e5 + 5;
int v[dim] , dp[dim] , p[dim] , k , n;
vector <int> Sol;
void Reconstruire (int Lg , int poz)
{
if(Lg >= 1)
{
int i = poz;
for(; p[i] != Lg; --i);
Reconstruire(Lg - 1 , i);
fout << dp[p[i]] << " ";
}
}
int main()
{
fin >> n;
for(int i = 1 ; i <= n ; ++i)
fin >> v[i];
dp[++k] = v[1];
p[1] = 1;
for(int i = 2 ; i <= n ; ++i)
if(v[i] > dp[k])
{
dp[++k] = v[i];
p[i] = k;
}
else if(v[i] <= dp[k])
{
int l = 1 , r = k , poz = k + 1;
while(l <= r)
{
int mid = (l + r) / 2;
if(dp[mid] > v[i])
{
poz = mid;
r = mid - 1;
}
else
l = mid + 1;
}
dp[poz] = v[i];
p[i] = poz;
}
int j = n;
for(int i = k ; i ; --i)
{
while(p[j] != i) --j;
if(Sol.empty() || Sol[Sol.size() - 1] != v[j])
Sol.push_back(v[j]);
}
fout << Sol.size() << '\n';
for(int i = Sol.size() - 1 ; i >= 0 ; --i) fout << Sol[i] << " ";
}