Pagini recente » Cod sursa (job #2790012) | Cod sursa (job #1336894) | Cod sursa (job #1577212) | Cod sursa (job #2710844) | Cod sursa (job #2144573)
#include<fstream>
#include<stack>
#include<climits>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int Nmax = 100005;
const int Inf = INT_MAX;
int Lungime[Nmax], Tata[Nmax], V[Nmax], LungimeMaxima, N, Index, Copie;
stack<int>Stiva;
inline void Citire(){
f >> N;
for(Index = 1; Index <= N; ++Index)
f >> V[Index];
}
inline void CautareBinara(int Valoare, int Pozitie){
++LungimeMaxima;
int IndiceStanga, IndiceDreapta, Mijloc;
IndiceStanga = 1;
IndiceDreapta = LungimeMaxima;
while(IndiceStanga != IndiceDreapta){
Mijloc = (IndiceStanga + IndiceDreapta) >> 1;
if(Valoare > Lungime[Mijloc])
IndiceStanga = Mijloc + 1;
else
IndiceDreapta = Mijloc;
}
Lungime[IndiceDreapta] = Valoare;
Tata[Pozitie] = IndiceDreapta;
if(Lungime[LungimeMaxima] == Inf)
--LungimeMaxima;
}
inline void Rezovare(){
for(Index = 1; Index <= N; ++Index)
Lungime[Index] = Inf;
++LungimeMaxima;
Tata[1] = 1;
Lungime[1] = V[1];
for(Index = 2; Index <= N; ++Index)
CautareBinara(V[Index], Index);
Copie = LungimeMaxima;
for(Index = N; Index >= 1; --Index)
if(Tata[Index] == Copie){
Stiva.push(V[Index]);
--Copie;
}
}
inline void Printare(){
g << LungimeMaxima << '\n';
while(!Stiva.empty()){
g << Stiva.top() << ' ';
Stiva.pop();
}
}
int main(){
Citire();
Rezovare();
Printare();
return 0;
}