Pagini recente » Cod sursa (job #356598) | Cod sursa (job #2842776) | Cod sursa (job #13814) | Cod sursa (job #3217868) | Cod sursa (job #2261645)
#include<iostream>
#include<fstream>
using namespace std;
#define MAX 100005
int v[MAX], L[MAX], best[MAX], p[MAX], n, nr;
// v - numere array
// best[i] - lung max pana la i inclusiv,
// p - predecesor in sir
// L - sir(uri) curente (pozitii cu trimitere la v)
// nr - lungime sir maxim
void afis(ofstream &out, int where){
if(p[where]!=0) afis(out, p[where]);
out<<v[where]<<" ";
}
int cauta(int val){
int left=0, right=nr, mid=(left+right)/2;
while(left<=right){
if( v[L[mid]] < val && val<= v[L[mid+1]] ) return mid;
if ( v[L[mid]] < val )
left+=1;
else right-=1;
mid = (left+right)/2;
}
return nr; //nu se intercaleaza, se adauga la sfarsiul sirului maxim existent
}
int main(){
ifstream in("scmax.in"); ofstream out("scmax.out");
int i, poz;
in>>n;
for(i=1;i<=n;i++)
in>>v[i];
L[1]=1; best[1]=1;
nr=1;
//where the magic happens
for(i=2;i<=n;i++){
poz = cauta(v[i]);
p[i] = L[poz];
L[poz+1] = i;
best[i] = poz+1;
if(nr < poz+1) nr = poz + 1;
}
//and the winner is:
int lungMax=0, start=0;
for(i=1; i<=n; i++)
if(best[i] > lungMax) {
lungMax=best[i]; start=i;
}
//afisare
out<<lungMax<<'\n';
afis(out, start);
in.close(); out.close();
return 0;
}