Pagini recente » Istoria paginii runda/fail/clasament | Cod sursa (job #159990) | Istoria paginii runda/simulare_oji_adi | Istoria paginii runda/live1 | Cod sursa (job #1680413)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 100005;
int v[NMAX],best[NMAX],L[NMAX],p[NMAX];
int n;
int bLength;
int binar(int val)
{
int x = 0,y = bLength;
int m;
while(x<=y)
{
m = (x+y)/2;
if(v[L[m]] < val && v[L[m+1]] >= val)
return m;
else
{
if(v[L[m]] >= val)
y = m - 1;
else
x = m + 1;
}
}
return bLength;
}
void print(int index)
{
if(p[index] != 0)
print(p[index]);
out<<v[index]<<" ";
}
int main()
{
in>>n;
for(int i=1;i<=n;i++)
in>>v[i];
in.close();
bLength = 1;
L[0] = 0;
L[1] = 1;
best[1] = 1;
int best_l,maxx = 1,pos = 1;
for(int i=2;i<=n;i++)
{
best_l = binar(v[i]);
best[i] = best_l + 1;
L[best_l+1] = i;
p[i] = L[best_l];
if(bLength < best_l + 1)
bLength = best_l + 1;
if(best[i] > maxx)
{
maxx = best[i];
pos = i;
}
}
out<<maxx<<"\n";
print(pos);
out.close();
return 0;
}