Pagini recente » Cod sursa (job #1336500) | Cod sursa (job #726844) | Cod sursa (job #2281387) | Cod sursa (job #2071624) | Cod sursa (job #177233)
Cod sursa(job #177233)
#include <fstream>
#define bit(x) ((x&(x-1))^(x))
#define MAX 100005
using namespace std;
int n;
int val[MAX], a[MAX], aib[MAX], prim[MAX], v[MAX], t[MAX];
void Update(int x, int poz)
{
for (; x <= n; x += bit(x))
if (a[poz] > a[aib[x]])
aib[x] = poz;
}
int Query(int x)
{
int max = 0;
for (; x; x -= bit(x))
if (a[aib[x]] > a[max])
max = aib[x];
return max;
}
int main()
{
int i, h = 1, maxi = 0;
ifstream fin("scmax.in");
fin >> n;
for (i = 1; i <= n; i++)
{
fin >> val[i];
prim[i] = val[i];
}
fin.close();
sort(prim+1, prim+n+1);
for (i = 2; i <= n; i++)
if (prim[i] != prim[h]) prim[++h] = prim[i];
for (i = 1; i <= n; i++)
v[i] = lower_bound(prim+1, prim+h+1, val[i]) - prim;
for (i = 1; i <= n; i++)
{
t[i] = Query(v[i]-1);
a[i] = a[t[i]] + 1;
Update(v[i], i);
}
ofstream fout("scmax.out");
for (i = 1; i <= n; i++)
if (a[maxi] < a[i]) maxi = i;
fout << a[maxi] << "\n";
for (h = 0, i = maxi; i; i = t[i])
prim[++h] = val[i];
for (i = h; i; i--)
fout << prim[i] << " ";
fout.close();
return 0;
}