Pagini recente » Cod sursa (job #357564) | Cod sursa (job #3301405) | Diferente pentru problema/hacker3 intre reviziile 2 si 1 | Cod sursa (job #3230671) | Cod sursa (job #3337896)
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int s[100001];
int ps[100001];
int v[100001];
int dp[100001];
int n, k = 0, last;
int bs ( int x, int sir[100001] )
{
int st = 1, dr = k;
int sol = k + 1;
while ( st <= dr )
{
int mij = ( st + dr ) / 2;
if ( sir[mij] >= x )
{
sol = mij;
dr = mij - 1;
}
else st = mij + 1;
}
return sol;
}
void afisare()
{
vector <int> afis;
while ( k > 0 )
{
afis.push_back(v[last]);
last = dp[last];
k --;
}
for ( int i = afis.size() - 1; i >= 0; i -- )
g << afis[i] << " ";
}
int main()
{
f >> n;
for ( int i = 1; i <= n; i ++ )
{
f >> v[i];
int poz = bs( v[i], s ); /// upper bound
s[poz] = v[i];
ps[poz] = i;
dp[i] = ps[poz - 1];
k = max ( k, poz );
if ( k == poz )
last = i;
}
g << k << '\n';
afisare();
return 0;
}