Pagini recente » Cod sursa (job #2043327) | Cod sursa (job #2305711) | Cod sursa (job #930450) | Cod sursa (job #2559854) | Cod sursa (job #627348)
Cod sursa(job #627348)
#include <fstream>
using namespace std;
#define maxN 100001
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int pozitie[maxN], predecesor[maxN], vect[maxN], n, L, j;
inline int cautareBinara(int st, int dr, int val){
int mij;
while(st <= dr){
mij = (st + dr)/2;
if(vect[pozitie[mij]] <= val && (vect[pozitie[mij+1]] > val || pozitie[mij+1]==0))
return mij;
if(val <= vect[pozitie[mij]])
dr = mij-1;
else
st = mij+1;
}
return 0;
}
int main(){
fin >> n;
for(int i = 1; i<=n; i++)
fin >> vect[i];
for(int i=1; i<=n; i++){
j = cautareBinara(1, L, vect[i]);
if(vect[i]!=vect[pozitie[j]]){
predecesor[i] = pozitie[j];
if(vect[pozitie[j+1]] > vect[i] || j == L){
pozitie[j+1] = i;
L = (L < j+1 ? j+1 : L);
}
}
}
int x = pozitie[L];
int i = L;
while(x)
{
pozitie[i] =vect[x];
i--;
x = predecesor[x];
}
fout << L << '\n';
for(i = 1; i<=L; i++)
fout<<pozitie[i]<<' ';
fout<<'\n';
fout.close();
return 0;
}