Cod sursa(job #2648587)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 11 septembrie 2020 16:31:14
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 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<pair<pair<int,int> ,int> >q;

vector<int> ans;

bool ok(pair<pair<int,int> ,int> a,pair<pair<int,int> ,int> b)
{
	return a.second<b.second;
}
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];
			q.push_back({{v[i],0},i});
		}
	sort(q.begin(),q.end());
	sort(v1+1,v1+n+1);
	q[0].first.second=1;
	for(int i=2;i<=n;i++)
	{
		q[i-1].first.second=i;
		if(v1[i]==v1[i-1]) 
			q[i-1].first.second=q[i-2].first.second;
	}
	sort(q.begin(),q.end(),ok);
	for(int i=0;i<n;i++)
		norma[i+1]=q[i].first.second;
	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;
}