Pagini recente » Cod sursa (job #1190679) | Cod sursa (job #2789861) | Cod sursa (job #2561406) | Cod sursa (job #1804082) | Cod sursa (job #705447)
Cod sursa(job #705447)
//cu arbori de intervale
#include <fstream>
#include <algorithm>
using namespace std;
int arb[700002],poz[700002],i,x,a[100002],p[100002],v[100002],b[100002],prev[100002],pmax,n,y,maxim,val,maxarb;
void query(int nod,int l,int r)
{
if(l>=x and r<=y)
{
if(val<arb[nod]) { val=arb[nod]; maxarb=poz[nod]; }
return;
}
int m=(r+l)/2;
if(x<=m) query(2*nod,l,m);
if(y>m) query(2*nod+1,m+1,r);
}
void update(int nod,int l,int r)
{
if(l==r)
{
arb[nod]=x;
poz[nod]=i;
return;
}
int m=(l+r)/2;
if(a[i]<=m) update(2*nod,l,m);
if(a[i]>m) update(2*nod+1,m+1,r);
if(arb[2*nod]>arb[2*nod+1]) {arb[nod]=arb[2*nod]; poz[nod]=poz[2*nod]; }
else {arb[nod]=arb[2*nod+1]; poz[nod]=poz[2*nod+1]; }
}
int main()
{
ifstream fi("scmax.in");
ofstream fo("scmax.out");
fi>>n;
for(i=1;i<=n;i++)
{
fi>>a[i];
b[i]=v[i]=p[i]=a[i];
}
sort(p+1,p+n+1);
for(i=1;i<=n;i++) if(p[i]==p[i-1]) v[i]=v[i-1]; else v[i]=v[i-1]+1;
for(i=1;i<=n;i++)
{
x=lower_bound(p+1,p+n+1,a[i])-p;
a[i]=v[x];
}
maxim=1;
for(i=1;i<=n;i++)
{
val=0;
x=1; y=a[i]-1;
if(y>=x) query(1,1,v[n]);
if(val!=0) prev[i]=maxarb; else prev[i]=i;
x=max(1,val+1);
if(x>maxim){ maxim=x; pmax=i; }
update(1,1,v[n]);
}
fo<<maxim<<"\n";
int sol=0;
for(i=pmax;prev[i]!=i;i=prev[i]) a[++sol]=b[i];
a[++sol]=b[prev[i]];
for(i=sol;i>0;i--) fo<<a[i]<<" ";
fo<<"\n";
return 0;
}