Pagini recente » Cod sursa (job #2449768) | Cod sursa (job #566558) | Cod sursa (job #2439305) | Cod sursa (job #2451073) | Cod sursa (job #1944760)
#include<fstream>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMax = 100005;
const int oo = 1<<30;
int N,Poz,ND;
int V[NMax],AIB[NMax],Pre[NMax],Index[NMax];
stack <int> S;
void Read()
{
fin>>N;
for(int i = 1 ; i <= N ; ++i)
{
fin>>V[i];
Index[i] = i;
}
}
void Update(int pos,int Val)
{
for(int i = pos ; i <= N ; i += i & (-i))
AIB[i] = max(AIB[i],Val);
}
int Query(int pos)
{
int Max = 0;
for(int i = pos ; i ; i -= i & (-i))
{
Max = max(Max,AIB[i]);
Poz = i;
}
return Max;
}
bool Comp(int A,int B)
{
if(V[A] == V[B]) return (A > B);
return (V[A] < V[B]);
}
void Solve()
{
sort(Index+1,Index+N+1,Comp);
for(int i = 1 ; i <= N ; ++i)
{
cout<<AIB[i]<<" ";
int Max = Query(i-1);
Update(i,Max + 1);
Pre[i] = Poz;
}
ND = Query(N);
for(int i = Poz ; i ; i = Pre[i])
S.push(V[Index[i]]);
}
void Print()
{
fout<<ND<<"\n";
while(!S.empty())
{
fout<<S.top()<<" ";
S.pop();
}
}
int main()
{
Read();
Solve();
Print();
fin.close();
fout.close();
return 0;
}