Pagini recente » Rezultatele filtrării | Cod sursa (job #16576) | Cod sursa (job #221002) | Cod sursa (job #49884) | Cod sursa (job #345368)
Cod sursa(job #345368)
#include<stdio.h>
#include<algorithm>
using namespace std;
int A[100005];
int S[100005];
int sir[100005];
int i;
int maxim;
int value;
int n;
int Arb[263000];
int best[100005];
int start;
int afis;
int fin;
int Maxim(int a, int b)
{
if (a > b) return a;
return b;
}
void Update(int nod, int st, int dr)
{
if (st == dr)
{
Arb[nod] = value;
}
else
{
int mij = (st + dr) / 2;
if (fin + 1 <= mij) Update(2 * nod, st, mij);
else Update(2 * nod + 1, mij + 1, dr);
Arb[nod] = Maxim(Arb[2 * nod],Arb[2 * nod + 1]);
}
}
void Query(int nod, int st, int dr)
{
if (start <= st && dr <= fin)
{
if (maxim < Arb[nod])
maxim = Arb[nod];
return;
}
else
{
int mij = (st + dr) / 2;
if (start <= mij ) Query(2 * nod, st, mij );
if (fin > mij) Query(2 * nod + 1, mij + 1, dr);
}
}
int BinSearch(int val)
{
int st = 1;
int dr = sir[0];
while (st <= dr)
{
if (val < sir[(st+dr)/2])
dr = (st + dr) / 2 -1;
else
if (val > sir[(st + dr)/2])
st = (st + dr) / 2 + 1;
else
if (val == sir[(st + dr)/2])
return (st + dr) / 2;
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&A[i]);
memcpy(S,A,sizeof(A));
sort(S + 1, S + n + 1);
i = 1;
while (i <= n)
{
if (S[i] != S[i+1])
sir[++sir[0]] = S[i];
i++;
}
for(int i = 1; i <= n; i++)
{
A[i] = BinSearch(A[i]);
}
/*for(int i = 1; i <= n; i++)
{
start = 1;
fin = A[i] - 1;
maxim = 0;
if (fin > 0)
{
Query(1,1,sir[0]);
}
best[i] = maxim + 1;
value = best[i];
Update(1,1,sir[0]);
}*/
for(int i = 1; i <= n; i++)
if (afis < best[i]) afis = best[i];
printf("%d\n",afis);
return 0;
}