Cod sursa(job #2261635)

Utilizator b10nd3Oana Mancu b10nd3 Data 16 octombrie 2018 15:24:24
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#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;
}