Cod sursa(job #1379605)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 6 martie 2015 18:35:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

int n;
vector<int> AIB;
vector<int> D;


void update(int val, int index){
	for(;val<=n;val+=val&(-val))
		if(D[index]>D[AIB[val]])
			AIB[val]=index;
}

int query(int val){
	int mx=0;

	for(;val;val-=val&(-val))
		if(D[AIB[val]]>D[mx])
			mx=AIB[val];

	return mx;
}

int main(){
	ifstream fin("scmax.in");
	ofstream fout("scmax.out");

	fin>>n;
	vector<int> v(n+1);
	vector<int> increasing(n+1); increasing[0]=0;
	AIB.resize(n+1,0);
	D.resize(n+1,0);

	for(int i=1;i<=n;++i){
		fin>>v[i];
		increasing[i]=v[i];
	}

	sort(increasing.begin(),increasing.end());

	/*int h=1;
	for(int i=2;i<=n;++i)
		if(increasing[i]!=increasing[h])
			increasing[++h]=increasing[i];*/

	for(int i=0;i<=n;++i)
		//v[i]=lower_bound(increasing.begin()+1,increasing.begin()+h+1,v[i])-increasing.begin();
		v[i]=lower_bound(increasing.begin(),increasing.end(),v[i])-increasing.begin();

	vector<int> up(n+1);
	for(int i=1;i<=n;++i){
		up[i]=query(v[i]-1);
		D[i]=D[up[i]]+1;
		update(v[i],i);
	}


	unsigned bst=0;
	for(int i=1;i<=n;++i)
		if(D[bst]<D[i]) bst=i;

	int mx=D[bst];
	fout<<mx<<'\n';

	for(int i=1;i<=mx;++i){
		D[i]=increasing[v[bst]];
		bst=up[bst];
	}
	for(int i=mx;i;--i) fout<<D[i]<<' ';
	fout<<'\n';
}