Cod sursa(job #4095)

Utilizator raula_sanChis Raoul raula_san Data 30 decembrie 2006 12:33:46
Problema Secv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include<cstdio>
#define dim 5001

int N, M, L[dim], P[dim], S[dim], SOL; long A[dim], B[dim];

void read()
{
     freopen("secv.in", "r", stdin);
     scanf("%d", &N);
     
     int i;
     for(i=1; i<=N; ++i)
              scanf("%ld", A + i);
}

void swap(int i, int j)
{    B[i] ^= B[j] ^= B[i] ^= B[j];
     }

void heapUP(int k)
{
     if(k <= 1)
          return;
     int t = k / 2;
     if(B[t] < B[k])
     {
             swap(t, k);
             heapUP(t);
             }
}

void buildH()
{
     int i;
     for(i=2; i<=N; ++i)
              heapUP(i);
}

void restoreH(int r, int b)
{
     long st, dr, max;
     if(r << 1 <= b)
     {
          st = B[r<<1];
          
          if((r << 1) + 1 <= b)
                dr = B[(r<<1)+1];
          else
              dr = st - 1;
          
          max = st > dr ? r << 1 : (r << 1) + 1;
          
          if(B[r] < B[max])
          {
                  swap(max, r);
                  restoreH(max, b);
                  }
          }
}

void heapsort()
{
     int i;
	 for(i=N; i>1;)
     {
              swap(1, i);
              restoreH(1, --i);
              }
}

void copy()
{
     int i;
     for(i=1; i<=N; ++i)
              B[i] = A[i];
}

int b_search(long value)
{
    int st = 1, dr = M, m;
    
    while(st <= dr)
    {
             m = (st + dr) >> 1;
             if(B[m] == value)
                     return value;
             else
             {
                 if(value < B[m])
                          dr = m - 1;
                 if(value > B[m])
                          st = m + 1;
                 }
             }
}

void dynamics()
{
     int i, j, poz, p; L[1] = 1, P[1] = 0, S[1] = 1;
     for(i=2; i<=N; ++i)
     {        
              poz = b_search(A[i]);
              p = 0;
              for(j=1; j<i; ++j)
					   if(L[j] == poz - 1 && S[j] > S[p] && A[j] == B[poz-1])
                               p = j;
              L[i] = L[p] + 1; P[i] = p; S[i] = p != 0 ? S[p] : i;
              if(L[i] == M && (i - S[i] + 1) > SOL)
                      SOL = (i - S[i] + 1);
              }
}

void c_array()
{
     int x = B[1], i; M = 1;
     for(i=2; i<=N; ++i)
              if(B[i] != x)
              {
                      B[++M] = B[i];
                      x = B[i];
                      }
}

int main()
{
    read(); copy();
    buildH(); heapsort();
    c_array(); dynamics();
    
    freopen("secv.out", "w", stdout);
    printf("%d", SOL !=0 ? SOL : -1);
    
    fclose(stdin); fclose(stdout);
    return 0;
}