Cod sursa(job #2285332)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 18 noiembrie 2018 14:30:54
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include<stdio.h>

#include<iostream>
#include<fstream>

#include<set>
#include<vector>
#include<algorithm>
using namespace std;

struct pair_compare {
    bool operator() (const std::pair<int,int> & p1, const std::pair<int,int> & p2) const {
		if(p1.first == p2.first)
			return (p1.second < p2.second);
		else
			return (p1.first > p2.first);
    }
};

#define MAXN 100000

set<pair<int,int>,pair_compare> S;

int N;
int V[MAXN];
int B[MAXN];
int P[MAXN];

int main(){
	
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);

	scanf("%d",&N);

	pair<set<pair<int,int>,pair_compare>::iterator,bool> it1;
	set<pair<int,int>,pair_compare>::iterator it;
	int lung=1,pozbest=0;
	for(int i=0;i<N;i++){
		scanf("%d", &V[i]);
		B[i]=1;
		P[i]=-1;
		it1=S.insert(make_pair(1,i));
		for(it=S.begin();it!=S.end();it++){
			if(V[it->second]<V[i]){
				if((it->first+1)>B[i]){
					B[i]=it->first+1;
					P[i]=it->second;
				}
			}
		}
		it1.first->first=B[i];
		if(B[i]>lung){
			lung=B[i];
			pozbest=i;	
		}
	}

	printf("%d\n",lung);
	int lung1=lung;

	int* pozitii=new int[lung];
	while(pozbest!=-1){
		lung--;
		pozitii[lung]=pozbest;
		pozbest=P[pozbest];
	}

	for(int i=0;i<lung1;i++)
		printf("%d ",V[pozitii[i]]);

	return 0;
}