Pagini recente » Cod sursa (job #1078614) | Cod sursa (job #534239) | Cod sursa (job #1737576) | Cod sursa (job #116066) | Cod sursa (job #2481189)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
struct Sir
{
// un sir este format din ultimul element si sirul fara ultimul element
int a;
Sir* tata;
Sir(const int& a, Sir* const tata)
{
this->a = a;
this->tata = tata;
}
};
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, ma = 0;
Sir* A[100001];
int CB(int);
void Afisare();
int main()
{
fin >> n;
for (int i = 1; i <= n; ++i)
{
int a;
fin >> a;
int p = CB(a);
if (p == ma + 1)
++ma;
A[p] = new Sir(a, A[p - 1]);
}
Afisare();
return 0;
}
int CB(int a) // ret poz primului el >= a, sau ma+1 daca A[ma]<a
{
int st = 1, dr = ma + 1;
while (st <= dr)
{
int mij = (st + dr) / 2;
if ((A[mij] == nullptr || A[mij]->a >= a) && (A[mij - 1] == nullptr || A[mij - 1]->a < a))
return mij;
else if (A[mij - 1] != nullptr && A[mij - 1]->a >= a)
dr = mij - 1;
else st = mij + 1; // if (A[mij]->a < a)
}
}
void Afisare()
{
fout << ma << '\n';
stack<int> Q;
Sir* p = A[ma];
while (p != nullptr)
{
Q.push(p->a);
p = p->tata;
}
while (!Q.empty())
{
fout << Q.top() << " ";
Q.pop();
}
}