Pagini recente » Cod sursa (job #1145310) | Cod sursa (job #2068789) | Cod sursa (job #2346114) | Cod sursa (job #755359) | Cod sursa (job #701712)
Cod sursa(job #701712)
#include <fstream>
#define nmax 100004
#define LIM (1<<25)
#define verifica ++poz == LIM ? in.read(my_text,LIM),poz = 0 : 0
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
char my_text[LIM+2];
int poz;
int step,L,N;
int SC[nmax],V[nmax],T[nmax];
void Afiseaza(int p)
{
if(T[p])
Afiseaza(T[p]);
out<<V[p]<<' ';
}
inline void Citeste(int &nr)
{
if(my_text[0]=='\0')in.read(my_text,LIM);
else for(;my_text[poz]>'9'||my_text[poz]<'0';verifica);
for(nr=0;my_text[poz]>='0'&&my_text[poz]<='9';nr=nr*10+my_text[poz]-'0',verifica);
}
inline int Cauta(int x)
{
int i;
//caut binar intre 1 si L
for(step=1;step<L;step<<=1);
for(i=0;step;step>>=1)
if(i+step<=L)
if(V[SC[i+step]]<x)
i+=step;
return i;
}
int main()
{
int i,x,P;
Citeste(N);
for(i=1;i<=N;i++)
Citeste(V[i]);
SC[1] = 1;
L = 1;
for(i=2;i<=N;i++)
{
x = V[i];
P = Cauta(x);
if(P==L)
SC[++L]=i;
else if(V[SC[P+1]]>x)
SC[P+1]=i;
T[i] = SC[P];
}
out<<L<<'\n';
Afiseaza(SC[L]);
return 0;
}