Cod sursa(job #2648540)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 11 septembrie 2020 13:11:48
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

int v[100005],norma[100005],a[400005],v1[100005],dp[100005];
int valMax,pozValMax;

vector<int> ans;
void update(int node,int st,int dr,int poz,int val)
{
	int mid=(st+dr)/2;
	if(st==dr)
	{
		a[node]=val;
		return;
	}
	if(poz<=mid)
		update(2*node,st,mid,poz,val);
	else
		update(2*node+1,mid+1,dr,poz,val);
	a[node]=max(a[node*2],a[node*2+1]);
}

int query(int node,int st,int dr,int i,int j)
{
	if(i<=st&&j>=dr)
		return a[node];
	int mid=(st+dr)/2;
	int maxx=0,maxxx=0;
	if(i<=mid)
		maxx=query(2*node,st,mid,i,j);
	if(j>mid)
		maxxx=query(2*node+1,mid+1,dr,i,j);
	return max(maxx,maxxx);
}

int main()
{
	int n,ct=1,maxx=0;
	in>>n;
	for(int i=1;i<=n;i++)
		{
			in>>v[i];
			v1[i]=v[i];
			norma[i]=v[i];
		}
	sort(v1+1,v1+n+1);
	for(int i=1;i<=n;i++)
	{
		norma[i]=lower_bound(v1+1,v1+n+1,norma[i])-v1;
	}
	for(int i=1;i<=n;i++)
	{
		if(norma[i]==1)
			maxx=0;
		else
			maxx=query(1,1,n,1,norma[i]-1);
		update(1,1,n,norma[i],maxx+1);
		dp[i]=maxx+1;
		if(maxx+1>valMax)
		{
			valMax=maxx+1;
			pozValMax=i;
		}
	}
	out<<valMax<<"\n";
	for(int i=pozValMax;i>=1;i--)
	{
		if(dp[i]==valMax)
		{
			ans.push_back(v1[norma[i]]);
			valMax--;
		}
	}
	for(int i=ans.size()-1;i>=0;i--)
			out<<ans[i]<<" ";
//	for(int i=1;i<=n;i++)
//		cout<<norma[i]<<" ";	
	return 0;
}