Pagini recente » Cod sursa (job #2735784) | Cod sursa (job #1151185) | Cod sursa (job #1985941) | Cod sursa (job #2463750) | Cod sursa (job #2497621)
#include <fstream>
#include <map>
#define NMAX 1025
#define ub(x) x & -x
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[NMAX], n, vmax, tata[NMAX];
map <int, int> aib;
void update(int x, int val)
{
for (int i = x; i <= vmax; i += ub(i))
if (aib.find(i) != aib.end()) aib[i] = max(val, aib[i]);
else aib[i] = val;
}
int query(int x)
{
int val = 0;
for (int i = x; i; i -= ub(i))
val = max(val, aib[i]);
return val;
}
int main()
{
int maxi = 0;
fin >> n;
for (int i = 1; i <= n; ++i)
{
fin >> v[i];
if (v[i] > vmax) vmax = v[i];
int val = query(v[i] - 1) + 1;
tata[val] = i;
if (val > maxi) maxi = val;
update(v[i], val);
}
fout << maxi << "\n";
for (int i = 1; i <= maxi; ++i)
fout << v[tata[i]] << " ";
return 0;
}