Mai intai trebuie sa te autentifici.
Cod sursa(job #1345104)
Utilizator | Data | 17 februarie 2015 11:45:46 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.32 kb |
#include <fstream>
#include <cstdio>
#define NMAX 100001
using namespace std;
ofstream fout("scmax.out");
int n,lg,x;
struct v1{int val,pre;} a[NMAX];
struct v2{int bst,poz;} arb[NMAX*2];
int k[NMAX];
void adaug(int lg,int poz)
{
int tata=1,inc=1,sf=n;
while(inc!=sf)
{
if(poz>(inc+sf)/2) tata=tata*2+1,inc=(inc+sf)/2+1;
else tata=tata*2,sf=(inc+sf)/2;
}
while(arb[tata].bst<lg && tata>=1)
{
arb[tata].bst=lg,arb[tata].poz=poz;
tata=tata/2;
}
}
v2 determin(int nod,int inc,int sf)
{
if(a[arb[nod].poz].val < x)
return arb[nod];
int mij=(inc+sf)/2;
v2 st=determin(nod*2,inc,mij);
v2 dr=determin(nod*2+1,mij+1,sf);
v2 k; k.poz=0,k.bst=0;
if(x>a[st.poz].val) k=st;
if(x>a[dr.poz].val && dr.bst>st.bst) k=dr;
return k;
}
int caut(int poz)
{
v2 d = determin(1,1,n);
adaug(d.bst+1,poz);
return d.poz;
}
void afis(int poz)
{
while(poz!=0)
k[++lg]=a[poz].val,poz=a[poz].pre;
fout<<lg<<'\n';
for(int i=lg;i>=1;i--)
fout<<k[i]<<' ';
}
int main()
{
freopen("scmax.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
x=a[i].val;
a[i].pre=caut(i);
}
afis(arb[1].poz);
return 0;
}