Pagini recente » Cod sursa (job #2657693) | Cod sursa (job #1824864) | Cod sursa (job #218883) | Cod sursa (job #757660) | Cod sursa (job #2026792)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, sol,b[100010],tree[4000040],c[100010];
struct st
{
int val, poz;
}a[100010];
bool comp1 (st x, st y)
{
return (x.val<y.val);
}
bool comp2(st x, st y)
{
return (x.poz<y.poz);
}
void solve (int nod, int st, int dr, int x)
{
int mid=st+dr;
mid/=2;
if (st!=dr)
{
if (mid<x)
{
solve (nod*2+1, mid+1, dr, x);
tree[nod]=max(tree[nod*2+1],tree[nod*2]+1);
sol=max(sol,tree[nod]);
}
else
{
solve (nod*2, st, mid, x);
tree[nod]=max(tree[nod],tree[nod*2]);
}
}
else
{
tree[nod]=1;
}
}
int main()
{
int i;
f>>n;
for (i=1;i<=n;i++)
{
f>>a[i].val;
c[i]=a[i].val;
a[i].poz=i;
}
sort (a+1,a+n+1, comp1);
int x=1;
int aux=a[1].val;
a[1].val=1;
for (i=2;i<=n;i++)
{
if (a[i].val==aux) a[i].val=x;
else {aux=a[i].val;x++;a[i].val=x;}
}
sort (a+1,a+n+1,comp2);
for (i=1;i<=n;i++){
sol=1;
solve(1, 1, n, a[i].val);
b[i]=sol;
}
sol=0;
for (i=1;i<=n;i++) sol=max(sol, b[i]);
g<<sol<<"\n";
aux=2000000010;
int auxs=sol;
for (i=n;i>=1;i--)
{
if (b[i]==sol && aux>c[i]) {aux=c[i];sol--;a[sol+1].val=c[i];}
}
for (i=1;i<=auxs;i++) g<<a[i].val<<" ";
return 0;
}