Pagini recente » Cod sursa (job #1055058) | Cod sursa (job #9875) | Cod sursa (job #2186083) | Cod sursa (job #728432) | Cod sursa (job #1477500)
#include <fstream>
#include <map>
using namespace std;
typedef int var;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int V[200000], SCM[200000], Parent[200000], T[200000];
map<int, int> Map;
#define zeros(a) (a&-a)
void update(int poz, int val) {
for(;poz<=100000; poz += zeros(poz))
if(SCM[T[poz]] < SCM[val])
T[poz] = val;
}
int query(int poz) {
int r = 0;
for(;poz;poz-=zeros(poz))
if(SCM[r] < SCM[T[poz]])
r = T[poz];
return r;
}
void afis(int i) {
if(Parent[i]) afis(Parent[i]);
fout<<V[i]<<" ";
}
int main() {
int n, start = 0, val = 0;
fin>>n;
for(int i=1; i<=n; i++)
fin>>V[i], Map[V[i]] = 1;
for(auto &p : Map) p.second = ++val;
for(int i=1; i<=n; i++) {
Parent[i] = query(Map[V[i]] - 1);
SCM[i] = SCM[Parent[i]] + 1;
if(SCM[start] < SCM[i]) start = i;
update(Map[V[i]], i);
}
fout<<SCM[start]<<'\n';
afis(start);
return 0;
}