Cod sursa(job #968752)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 2 iulie 2013 18:27:16
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
struct vec
{int pos; int val;};
vec v[100005];
int n,a[300005],best[100005],v2[100005],sol=0,mx,nr,sub[100005],k;
bool comp(vec x,vec y)
{ if (x.val==y.val) return x.pos<y.pos;
  return x.val<y.val;
}
void Read()
{ int i;
  f>>n;
  for(i=1;i<=n;i++)
   {f>>v[i].val; v[i].pos=i; v2[i]=v[i].val;}
}
void Query(int nod,int st,int dr,int x,int y)
{ int mid;
  if (x<=st && dr<=y)
  { if (a[nod]>sol) sol=a[nod];}
 else
  { mid=(st+dr)/2;
     if (x<=mid) Query(2*nod,st,mid,x,y);
      if (y>mid) Query(2*nod+1,mid+1,dr,x,y);
  }
}
void Update(int nod,int st,int dr,int i,int value)
{ int mid;
  if (st==dr)
   {if (value>a[nod]) a[nod]=value;}
   else
   { mid=(st+dr)/2;
      if (i<=mid) Update(2*nod,st,mid,i,value);
       else Update(2*nod+1,mid+1,dr,i,value);
    a[nod]=max(a[2*nod],a[2*nod+1]);
   }
}
int main()
{ int i;
  Read();
  sort(v+1,v+n+1,comp);
  for(i=1;i<=n;i++) v[v[i].pos].val=i;
   mx=0; nr=0;
   for(i=1;i<=n;i++)
   { sol=0;
       if (v[i].val>1) Query(1,1,n,1,v[i].val-1);
       best[i]=sol+1;
       if (best[i]>mx) {mx=best[i]; nr=v2[i];}
      Update(1,1,n,v[i].val,best[i]);
   }
    mx++; k=0;
   for(i=n;i>=1;i--)
   if (best[i]==mx-1 && v2[i]<=nr)
   {k++; sub[k]=v2[i]; mx--; nr=v2[i];}
    g<<k<<"\n";
    for(i=k;i>=1;i--) g<<sub[i]<<" ";
    return 0;
}