Cod sursa(job #67988)

Utilizator dominoMircea Pasoi domino Data 26 iunie 2007 11:21:03
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 2048
#define FIN "psir.in"
#define FOUT "psir.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
#define mp make_pair
#define f first
#define s second

int N, P[MAX_N], nv; 
unsigned cnt[MAX_N][MAX_N],  Res;
pair < int, int >V[MAX_N];

int main (void)
{
    int i, j, k, k1, k2;
    unsigned s1, s2;

    freopen (FIN, "r", stdin);
    freopen (FOUT, "w", stdout);

    scanf ("%d", &N);
    FOR (i, 0, N) scanf ("%d", P + i);

    FOR (i, 0, N) V[i] = mp(P[i], i);
    sort (V, V + N);

    FOR (i, 0, N)
    {
        k1 = s1 = 0;
        k2 = s2 = 0;
        FOR (k, 0, i) s2 += cnt[k][i];

        FOR (j, 0, N)
        {
            if (V[j].s <= i) continue;
            cnt[i][V[j].s] = 1;
            if (V[j].f < P[i])
            {
               for (; k1 < N && V[k1].f < V[j].f; k1++)
                   if (V[k1].s < i) s1 += cnt[V[k1].s][i];
               cnt[i][V[j].s] += s1;
            }
            if (V[j].f > P[i])
            {
               for (; k2 < N && V[k2].f <= V[j].f; k2++)
                   if (V[k2].s < i) s2 -= cnt[V[k2].s][i];
               cnt[i][V[j].s] += s2;
            }

            Res += cnt[i][V[j].s];
        }
    }

    printf ("%u\n", Res);

    return 0;
}