Pagini recente » Cod sursa (job #2602307) | Cod sursa (job #949542) | Cod sursa (job #1339622) | Cod sursa (job #153860) | Cod sursa (job #2261635)
#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;
//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=-1, 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;
}