Pagini recente » Cod sursa (job #2032930) | Cod sursa (job #752346) | Cod sursa (job #2047055) | Cod sursa (job #1870394) | Cod sursa (job #649031)
Cod sursa(job #649031)
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<assert.h>
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();
assert(!Trie[100].x && !Trie[100].y);
Scmax();
int MAX,poz;
MaxAIB(N,MAX,poz);
g << MAX << "\n";
Afis(poz);
return 0;
}