Pagini recente » Cod sursa (job #2394508) | Cod sursa (job #1466028) | Cod sursa (job #1958) | Cod sursa (job #1685115) | Cod sursa (job #442745)
Cod sursa(job #442745)
///enervant
#include <stdio.h>
int n, v[100003], best[100003], p[100003], maxim, k, L[100003], nr;
void afis(int i)
{
if (p[i] > 0) afis(p[i]);
printf("%d ",v[i]);
}
int caut(int x)
{
int p, u, m;
p = 0; u = nr; m = (p+u)/2;
while (p <= u)
{
if (v[L[m]] < x && v[L[m+1]] >= x) return m;
else if (v[L[m+1]] < x) {p = m + 1; m = (p + u)/2;}
else {u = m - 1; m = (p + u)/2;}
}
return nr;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int i, j, poz;
nr = 1;
scanf("%d",&n);
for (i = 1; i <= n; i++) scanf("%d", v + i);
best[1] = L[1] = 1; L[0] = 0;
for (i = 2; i <= n; i++)
{
poz = caut(v[i]);
p[i] = L[poz];
best[i] = poz + 1;
L[poz + 1] = i;
if (nr < poz + 1) nr = poz + 1;
}
maxim = 0; poz = 0;
for (i = 1; i <= n; i++)
if (maxim < best[i])
{
maxim = best[i]; poz = i;
}
printf("%d\n",maxim);
afis(poz);
return 0;
}
//#include <fstream>
//#include <list>
//#include <vector>
//#include <algorithm>
//#include <stack>
//#include <iostream>
//using namespace std;
//
//
//struct compara{
// int pos;
// vector<int> &numere;
// compara(int pos_,vector<int> &numere_):pos(pos_),numere(numere_){}
//};
//bool operator<(const compara& a,const compara& b){
// return a.numere[a.pos]<b.numere[b.pos];
//}
//
//int main(){
// ifstream in("scmax.in");
// ofstream out("scmax.out");
//
// int n;in>>n;
// vector<int> numere(n);
// vector<int> pred(n,-1);
// vector<int> marime(n,1);
// for(int i=0;i<n;i++) in>>numere[i];
//
// list<compara> pos;
//
// int maxim=0;
//
// for(int i=0;i<n;i++){
// compara temp(i,numere);
// list<compara>::iterator it=lower_bound(pos.begin(),pos.end(),temp);
//
// if(it!=pos.begin()){
// list<compara>::iterator prev=it;prev--;
// marime[i]=marime[prev->pos]+1;
// pred[i]=prev->pos;
// pos.insert(it,temp);
// while(it!=pos.end()){
// if(numere[i]==numere[it->pos]){
// it=pos.erase(it);
// }else{
// break;
// }
// }
//
// if(marime[i]>marime[maxim]) maxim=i;
// }else{
// pos.insert(it,temp);
// }
//
// }
//
// out<<marime[maxim]<<endl;
// stack<int> s;
// do{
// s.push(numere[maxim]);
// maxim=pred[maxim];
// }while(maxim!=-1);
//
// while(!s.empty()){
// out<<s.top()<<" ";
// s.pop();
// }
//}