Pagini recente » Atasamentele paginii Profil dianacristina415 | Monitorul de evaluare | Atasamentele paginii Clasament hoata2 | Monitorul de evaluare | Cod sursa (job #706056)
Cod sursa(job #706056)
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
struct normalizare {
int val,poz;
};
struct subsir {
int val,valn;
};
normalizare x[100001];
subsir v[100001];
int l[100001],val,poz,a,b,arb[400001],valmax;
inline bool cmp(const normalizare a, const normalizare b)
{
return a.val<b.val;
}
int maxim(int a, int b)
{
if(a>=b)
return a;
return b;
}
void update(int nod, int st, int dr)
{
int mij;
if((a<=st)&&(dr<=b)) {
if(val>arb[nod])
arb[nod]=val;
return;
}
if(st==dr)
return;
mij=(st+dr)/2;
if(a<=mij)
update(2*nod,st,mij);
if(mij<b)
update(2*nod+1,mij+1,dr);
}
void query(int nod, int st, int dr)
{
int mij;
if((st<=poz)&&(poz<=dr)&&(valmax<arb[nod]))
valmax=arb[nod];
if(st==dr)
return ;
mij=(st+dr)/2;
if(poz<=mij)
query(2*nod,st,mij);
else query(2*nod+1,mij+1,dr);
}
int main ()
{
int n,i,max,c,nr,ultim;
ifstream f("scmax.in");
ofstream g("scmax.out");
f>>n;
for(i=1;i<=n;i++) {
f>>v[i].val;
x[i].val=v[i].val;
x[i].poz=i;
}
f.close();
sort(x+1,x+n+1,cmp);
c=0;
for(i=1;i<=n;i++) {
if(x[i].val!=x[i-1].val)
c++;
v[x[i].poz].valn=c;
}
nr=c;
l[n]=1;
val=1;
a=1;
b=v[n].valn-1;
update(1,1,n);
for(i=n-1;i>=1;i--) {
valmax=0;
poz=v[i].valn;
query(1,1,n);
l[i]=valmax+1;
b=v[i].valn-1;
val=l[i];
update(1,1,n);
}
max=0;
for(i=1;i<=n;i++)
if(l[i]>max) {
max=l[i];
poz=i;
}
g<<max<<'\n';
g<<v[poz].val<<" ";
max--;
ultim=poz;
i=poz+1;
while((max)&&(i<=n)) {
if((l[i]==max)&&(v[ultim].val<v[i].val)) {
g<<v[i].val<<" ";
max--;
ultim=i;
}
i++;
}
g.close();
return 0;
}