Pagini recente » Cod sursa (job #1572474) | Cod sursa (job #1540606) | Cod sursa (job #1796425) | Cod sursa (job #1439377) | Cod sursa (job #649036)
Cod sursa(job #649036)
#include<stdio.h>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
typedef struct
{
int x,y,z;
} xy;
#define MaxN 100100
int N,T[MaxN];
xy A[MaxN],B[MaxN],Trie[MaxN];
void citire(void)
{
f >> N;
for(int i=1;i<=N;i++)
f >> A[i].x;
}
int cmp(xy a,xy b)
{
return a.x < b.x;
}
void Normalizare(void)
{
for(int i=1;i<=N;i++)
B[i].x = A[i].x, B[i].y = i;
sort(B+1,B+N+1,cmp);
for(int i=1;i<=N;i++)
{
B[i].z = B[i].x != B[i-1].x ? B[i-1].z+1 : B[i-1].z;
A[B[i].y].y = B[i].z;
}
}
void UpdateAIB(int a,int val,int poz)
{
for(;a <= N;)
{
val > Trie[a].x ? Trie[a].x = val,Trie[a].y = poz : 0;
a += a & -a;
}
}
void MaxAIB(int a,int *val,int *poz)
{
for(;a;)
{
*val < Trie[a].x ? *val = Trie[a].x, *poz = Trie[a].y : 0;
a -= a & -a;
}
}
void Scmax(void)
{
for(int i=1;i<=N;i++)
{
Trie[A[i].y].x = 0;
MaxAIB(A[i].y-1,&Trie[A[i].y].x,&T[i]);
Trie[A[i].y].x ++;
Trie[A[i].y].y = i;
UpdateAIB(A[i].y,Trie[A[i].y].x,i);
}
}
void Afis(int a)
{
if(a)
{
Afis(T[a]);
g << A[a].x << " ";
}
}
int main()
{
citire();
Normalizare();
Scmax();
int MAX = 0,poz = 0;
MaxAIB(N,&MAX,&poz);
g << MAX << " \n";
Afis(poz);
return 0;
}