Pagini recente » Cod sursa (job #1261584) | Cod sursa (job #2265609) | Cod sursa (job #826952) | Cod sursa (job #244308) | Cod sursa (job #708813)
Cod sursa(job #708813)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXN 100005
#define zeros(x) (x^(x-1))&x
ifstream fin("scmax.in");
ofstream fout("scmax.out");
struct nod{
int val;
int poz;
};
bool comp(nod a, nod b) {
return (a.val<b.val);
}
nod a[MAXN],aux;
int v[MAXN],n,i,j,k,aib[MAXN],maxim,pozmax,aibdela[MAXN],dela[MAXN],ax,de,rel[MAXN];
vector<int> st;
void citire() {
fin>>n;
for(i=1;i<=n;i++) {
fin>>a[i].val;
a[i].poz=i;
}
}
void upd(int val, int poz, int ax) {
for(;poz<=n;poz+=zeros(poz)) {
if (val>aib[poz]) {
aib[poz]=val;
aibdela[poz]=ax;
}
}
}
int cauta(int poz, int &d) {
int rez=0;
d=0;
for(;poz;poz-=zeros(poz)) {
if (rez<aib[poz]) {
rez=aib[poz];
d=aibdela[poz];
}
}
return rez;
}
int main() {
citire();
sort(a+1,a+n+1,comp);
j=0;
a[0].val=-999999999;
for(i=1;i<=n;i++) {
if (a[i].val!=a[i-1].val) j++;
v[a[i].poz]=j;
//cout<<j<<" ";
rel[j]=a[i].val;
}
aib[0]=0;
for(i=1;i<=n;i++) {
k=cauta(v[i]-1,de);
k++;
dela[i]=de;
upd(k,v[i],i);
if (k>maxim) {
maxim=k;
pozmax=i;
}
}
fout<<maxim<<"\n";
while (pozmax>0) {
st.push_back(pozmax);
pozmax=dela[pozmax];
}
for(i=st.size()-1;i>=0;i--) {
fout<<rel[v[st[i]]]<<" ";
}
fout<<"\n";
fout.close();
return 0;
}