Pagini recente » Cod sursa (job #1396441) | Cod sursa (job #2694224) | Cod sursa (job #1145777) | Cod sursa (job #2361759) | Cod sursa (job #3277287)
#include <bits/stdc++.h>
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
const int SIZE = 1e5 + 5;
// k = dimensiunea maxima a unui subsir crescator
// origin[] = vectorul de numere
// v[i] = elementul de pe pozitia i din subsirul crescator
// poz[i] = lungimea unui subsir ce se termina cu origin[i]
int n, x, k;
int v[SIZE], poz[SIZE], origin[SIZE];
std::vector<int> stack;
int64_t max(std::vector<int64_t> v){ return *std::max_element(v.begin(), v.end()); }
int64_t min(std::vector<int64_t> v){ return *std::min_element(v.begin(), v.end()); }
int main()
{
fin >> n;
for(int i = 1; i <= n; ++i)
{
// elementul din sir
fin >> x;
origin[i] = x;
// cautam binar in vectorul v unde am putea pune elementul x folosind lower_bound()
// avem de la 1 la k, pt ca la un moment dat asta este intervalul posibil de lungimi
int pos = std::lower_bound(v + 1, v + k + 1, x) - v;
// elementul de pe pozitia pos in subsir este x
v[pos] = x;
// lungimea unui subsir ce se termina cu origin[i]
poz[i] = pos;
// update la dimensiunea maxima
k = max({k, poz[i]});
}
// afisez lungimea maxima
fout << k << "\n";
// parcurg sirul [dr->st], daca poz[i] = k <=> am gasit un canditat, il bag in stiva si decrementez k
for(int i = n; i >= 1; --i)
if(poz[i] == k)
stack.push_back(origin[i]), k--;
// afisez subsirul din stiva
while(!stack.empty())
{
fout << stack.back() << " ";
stack.pop_back();
}
return 0;
}