Cod sursa(job #1777753)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 12 octombrie 2016 20:53:56
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2000000000
#define MaxN 100005
#define MaxT 265000
using namespace std;
    
FILE *IN,*OUT;
int N,v[MaxN],T[MaxT],Max=0,Pos,X,Val,S=0;
struct _Norm
{
	int val,pos;
}p[MaxN];
bool cond(_Norm a,_Norm b)
{
	return a.val<b.val;
}

inline void Update(int node,int start,int end)
{
	int mid;
	while(start!=end)
	{
		mid=(start+end)>>1;
		if(Pos>mid)start=mid+1,node=(node<<1)+1;
		else end=mid,node<<=1;
	}
	T[node]=X;
	node>>=1;
	while(node)
	{
		T[node]=max(T[node<<1],T[(node<<1)+1]);
		node>>=1;
	}
}
void Query(int node,int start,int end)
{
	if(Pos==1)
		return;
	else if(end<Pos)
	{
		Val=max(Val,T[node]);
	}
	else
	{
		int mid=(start+end)>>1;
		Query(node<<1,start,mid);
		if(Pos-1>mid)Query((node<<1)+1,mid+1,end);
	}
}
int main()
{
	IN=fopen("scmax.in","r");
	OUT=fopen("scmax.out","w");
	
	fscanf(IN,"%d",&N);
	for(int i=1;i<=N;i++)
		fscanf(IN,"%d",&v[i]),p[i].pos=i,p[i].val=v[i];
	sort(p+1,p+1+N,cond);
	for(int i=1;i<=N;i++)
	{
		if(p[i-1].val!=p[i].val)S++;
		v[p[i].pos]=S;
	}
	for(int i=1;i<=N;i++)
	{
		Pos=v[i];
		Val=0;
		Query(1,1,N);
		X=1+Val;
		Max=max(Max,X);
		Update(1,1,N);
	}
	fprintf(OUT,"%d",Max);
	return 0;
}