Pagini recente » Cod sursa (job #937371) | Cod sursa (job #2085785) | Cod sursa (job #2434154) | Cod sursa (job #1275298) | Cod sursa (job #2759321)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100000 //o suta de mii
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int N;
int aib[NMAX + 1];
int bst[NMAX + 1];
int afis[NMAX + 1];
struct element{
int val;
int poz;
}v[NMAX + 1], w[NMAX + 1];
int comparare(element A, element B){
return A.val < B.val || (A.val == B.val && A.poz > B.poz);
}
inline void update(int poz, int val){
//poz nu o sa contina nimic inainte
//garantat
for(int i = poz; i <= N; i += i & (-i)){
aib[i] = max(aib[i], val);
}
}
inline int query(int poz){
int mx = 0;
for(int i = poz; i >= 1; i -= i & (-i)){
mx = max(mx, aib[i]);
}
return mx;
}
int main()
{
int dimW;
fin >> dimW;
for(int i = 1; i <= dimW; i++){
fin >> w[i].val;
w[i].poz = i;
}
sort(w + 1, w + dimW + 1, comparare);
N = 1;
v[1] = w[1];
for(int i = 2; i <= dimW; i++){
if(w[i].val != w[i - 1].val){
N++;
v[N] = w[i];
}
}
int rspMx = 0;
for(int i = 1; i <= N; i++){
bst[i] = 1 + query(v[i].poz - 1);
update(v[i].poz, bst[i]);
rspMx = max(rspMx, bst[i]);
}
fout << rspMx << "\n";
int aux = rspMx;
for(int i = N; i >= 1 && aux >= 1; i--){
if(bst[i] == aux){
afis[aux] = v[i].val;
aux--;
}
}
for(int i = 1; i <= rspMx; i++){
fout << afis[i] << ' ';
}
return 0;
}