Pagini recente » Cod sursa (job #2063245) | Cod sursa (job #2990231) | Cod sursa (job #1585497) | Cod sursa (job #1554245) | Cod sursa (job #2685651)
#include <fstream>
#define NMAX 100001
std::ifstream f("scmax.in");
std::ofstream g("scmax.out");
int N, Arr[NMAX], Arr_Asc[NMAX], Prev[NMAX], Index[NMAX], Len = 1;
void Path(int i)
{
if(Prev[i] != 0)
Path(Prev[i]);
g << Arr[i] << ' ';
}
int main()
{
f >> N;
for(int i = 1; i <= N; i++)
f >> Arr[i];
f.close();
Arr_Asc[1] = Arr[1];
Index[1] = 1;
for(int i = 2; i <= N; i++)
{
if(Arr[i] > Arr_Asc[Len])
{
Arr_Asc[++Len] = Arr[i];
Prev[i] = Index[Len - 1];
Index[Len] = i;
}
else if(Arr[i] < Arr_Asc[1])
{
Arr_Asc[1] = Arr[i];
Index[1] = i;
}
else
{
int l = 1, r = Len;
while(l < r - 1)
{
int m = (l + r) / 2;
if(Arr_Asc[m] >= Arr[i])
r = m;
else
l = m;
}
if(Arr_Asc[r] != Arr[i])
{
Arr_Asc[r] = Arr[i];
Prev[i] = Index[r - 1];
Index[r] = i;
}
}
}
g << Len << '\n';
Path(Index[Len]);
return 0;
}