Pagini recente » Cod sursa (job #1986705) | Cod sursa (job #596508) | Cod sursa (job #1852544) | Cod sursa (job #880933) | Cod sursa (job #1461924)
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cassert>
#define ft first
#define sd second
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
#define pb push_back
using namespace std;
const int kp = 100003;
vector <int> v;
int n;
int Max, pos;
int prv[kp], aib[kp], here[kp];
void update (int poz, int value){
for (; poz <= n; poz += poz & -poz)
aib[poz] = max(aib[poz], value);
}
int query (int poz){
int lr = 0;
for (; poz ; poz -= poz & -poz)
lr = max(lr, aib[poz]);
return lr;
}
int main(){
ifstream in ("scmax.in");
ofstream out ("scmax.out");
in >> n;
forn(i, n)
in >> prv[i], v.pb(prv[i]);
sort(v.begin(), v.end());
v.resize( unique(v.begin(), v.end()) - v.begin() );
forn(i, n){
prv[i] = lower_bound(v.begin(), v.end(), prv[i]) - v.begin() + 1;
assert(prv[i]);}
forn(i, n){
here[i] = query(prv[i] - 1) + 1;
update(prv[i] , here[i]);
if (here[i] > Max)
Max = here[i], pos = i;
}
vector <int> FT;
for (; pos >= 0 ; ){
FT.pb(v[prv[pos] - 1]);
int k;
for (k=pos-1; k>=0; -- k)
if (prv[k] < prv[pos] && here[k] == here[pos] - 1) break;
pos = k;
}
out << Max << "\n";
reverse(FT.begin(), FT.end());
for (const auto it : FT)
out << it << " ";
return 0;
}