Pagini recente » Cod sursa (job #1345439) | Cod sursa (job #1690883) | Cod sursa (job #1844916) | Cod sursa (job #2885365) | Cod sursa (job #1545521)
#include<fstream>
using namespace std;
ifstream f("scmax.in"); ofstream g("scmax.out");
const int Nmax=100001;
int N,V[Nmax],Q[Nmax],P[Nmax],SOL[Nmax];
int cautare(int key)
{ int st=1,dr=Q[0],gasit=-1;
while(st<=dr)
{ int m=(st+dr)/2;
if(key<=Q[m]) {gasit=m; dr=m-1;} /// am gasit un Q[m] mai mare decat key deci caut unul mai mic
else st=m+1;/// Q[m] este mai mic decat key deci caut unul mai mare
}
return gasit;
}
int main()
{ f>>N;
int i,poz;
for(i=1;i<=N;++i) f>>V[i];
for(i=1;i<=N;++i)
{ poz=cautare(V[i]); /// caut binar in Q cel mai mic element mai mare decat V[i]
if(poz==-1) /// V[i] este mai mare decat toate elem. vect Q
{ Q[++Q[0]]=V[i]; /// cresc dimensiunea subsirului maximal si pun V[i] in Q
P[i]=Q[0]; /// setez faptul ca V[i] corespunde pozitiei Q[0]
}
else
{ Q[poz]=V[i]; /// inlocuiesc elementul gasit mai mare cu V[i]
P[i]=poz; /// setez faptul ca V[i] corespunde pozitiei poz
}
}
g<<Q[0]<<'\n'; /// afisez dimensiunea
int j=N;
for(i=Q[0];i;--i) /// pentru fiecare pozitie a subsirului maximal
{ while(i!=P[j]) j--;/// caut elementul ce corespunde pozitiei i
SOL[i]=V[j]; /// il adaug in solutie
}
for(i=1;i<=Q[0];++i) g<<SOL[i]<<' ';
g.close(); return 0;
}