Pagini recente » Colors | Cod sursa (job #236870) | Cod sursa (job #2940) | Diferente pentru autumn-warmup-2007/solutii/runda-2 intre reviziile 30 si 56 | Cod sursa (job #2267069)
#include <fstream>
#define MAX 2000000001
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int nr, v[100004], best[100004], poz[100004];
int pus, contor, i, val, final, sol[100004];
void cautare(int val)
{
int st, dr, m;
st = 1;
dr = contor+1;
best[contor+1] = MAX;
while(st <= dr)
{
m = (st+dr)/2;
if(best[m] >= val && best[m-1] < val)
{
poz[i] = m;
best[m] = val;
break;
}
else
if(val > best[m])
st=m+1;
else
dr=m-1;
}
if(best[contor+1] != MAX)
contor++;
}
int main()
{
cin >> nr;
for(int i=1; i <= nr; i++)
cin >> v[i];
for(i=1; i <= nr; i++)
{
pus = 0;
cautare(v[i]);
}
i = nr;
val = contor;
while(val != 0)
{
if(poz[i] == val)
{
final++;
sol[final] = v[i];
val--;
}
i--;
}
cout << final << '\n';
for(int i=final; i > 0; i--)
cout << sol[i] << ' ';
}