Pagini recente » Cod sursa (job #1735276) | Cod sursa (job #2349676) | Cod sursa (job #2562708) | Cod sursa (job #394382) | Cod sursa (job #2409691)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
int n,v[100005],pozitie[100005],lun,ant[100005],sl,sol[100005];
struct str {
int val,poz;
}aib[100005];
pair<int,int> s[100005];
void update_aib (int poz, int elm, int val) {
for (int i = poz; i <= n; i += i&(-i)) {
if (val > aib[i].val) {
aib[i].val = val;
aib[i].poz = elm;
}
}
}
pair<int,int> query_aib (int poz) {
int maxim = 0;
int elm = 0;
for (int i = poz; i >= 1; i -= i&(-i)) {
if (maxim < aib[i].val) {
maxim = aib[i].val;
elm = aib[i].poz;
}
}
return {maxim,elm};
}
int main (void) {
in >> n;
for (int i = 1; i <= n; i ++) {
in >> v[i];
s[i].first = v[i];
s[i].second = i;
}
sort (s+1,s+n+1);
for (int i = 1; i <= n; i ++) {
int x = i;
while (s[x].first == s[x-1].first) {
x --;
}
pozitie[s[i].second] = x-1;
}
int maxim = 0;
int ultim = 0;
for (int i = 1; i <= n; i ++) {
if (pozitie[i] != 0) {
pair<int,int> aux = query_aib (pozitie[i]);
lun = aux.first + 1;
if (maxim < lun) {
maxim = lun;
ultim = i;
}
ant[i] = aux.second;
}
else {
lun = 1;
if (maxim < lun) {
maxim = lun;
ultim = i;
}
ant[i] = 0;
}
update_aib (pozitie[i]+1,i,lun);
}
while (true) {
sol[++sl] = v[ultim];
ultim = ant[ultim];
if (ultim == 0) break;
}
out << sl <<"\n";
for (int i = sl; i >= 1; i --) {
out << sol[i] <<" ";
}
return 0;
}