Cod sursa(job #2249446)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 29 septembrie 2018 21:16:51
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
const int NMAX=1e5+5;
int n,arb[4*NMAX],ind[4*NMAX],poz,sol,y[NMAX],mx,best[NMAX],pre[NMAX];
pair <int,int> x[NMAX];
vector <int> v;
void update(int nod,int a,int b,int pos,int val)
{
    if(a==b)
    {
        arb[nod]=val;
        ind[nod]=pos;
        return ;
    }
    int mij=(a+b)/2;

    if(pos<=mij)
        update(2*nod,a,mij,pos,val);
    else
        update(1+2*nod,mij+1,b,pos,val);

    {
        if(arb[2*nod]>=arb[2*nod+1])
        {
            arb[nod]=arb[2*nod];
            ind[nod]=ind[2*nod];
        }
        else
        {
            arb[nod]=arb[2*nod+1];
            ind[nod]=ind[2*nod+1];
        }
    }
}
void query(int nod,int st,int dr,int a,int b)
{
    if(a<=st && b>=dr)
    {
    	if(sol<arb[nod])
    	{
    		poz=ind[nod];
    		sol=arb[nod];
    	}
        return;
    }
    int mij=(st+dr)/2;
    if(a<=mij)
        query(2*nod,st,mij,a,b);
    if(b>=mij+1)
        query(2*nod+1,mij+1,dr,a,b);

}
int cmp(pair <int,int> A,pair <int,int> B)
{
    if(A.first<B.first)
        return 1;
    if(A.first>B.first)
        return 0;
    return (A.second>B.second);
}
int main()
{
	fi>>n;
	for(int i=1;i<=n;i++)
	{
		fi>>x[i].first;
		y[i]=x[i].first;
		x[i].second=i;
	}
	sort(x+1,x+n+1,cmp);
	update(1,1,n,x[1].second,1);
	best[1]=1;
	for(int i=2;i<=n;i++)
	{
		sol=0;
		poz=0;
		query(1,1,n,1,x[i].second);
		best[i]=sol+1;
		pre[x[i].second]=poz;
		update(1,1,n,x[i].second,sol+1);
	}
	mx=1;
	for(int i=1;i<=n;i++)
        if(best[i]>best[mx])
            mx=i;
	fo<<best[mx]<<"\n";
	v.push_back(y[x[mx].second]);
	poz=pre[x[mx].second];
	while(poz)
	{
		v.push_back(y[poz]);
		poz=pre[poz];
	}
	for(int i=v.size()-1;i>=0;i--)
        fo<<v[i]<<" ";
	fi.close();
	fo.close();
	return 0;
}