Mai intai trebuie sa te autentifici.

Cod sursa(job #1471844)

Utilizator ZenusTudor Costin Razvan Zenus Data 15 august 2015 13:36:25
Problema P-sir Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("psir.in");
ofstream fout("psir.out");

#define ui unsigned int

const ui NMAX = 2000 + 10;
const long long MOD = 1LL << 32;

vector < ui > aux;
ui x[NMAX];
ui i , N , j , ans , q;
ui aib[NMAX][NMAX];

inline ui lsb(ui x)
{
    return (x & (-x));
}

void update(ui line , ui x , ui p)
{
    for ( ; x <= 2000 ; x += lsb(x))
    aib[line][x] = (0LL + aib[line][x] + p) % MOD;
}

ui query(ui line , ui x)
{
    int ans = 0;

    for ( ; x ; x -= lsb(x))
    ans = (0LL + ans + aib[line][x]) % MOD;

    return ans;
}

int main()
{

fin >> N;

for (i = 1 ; i <= N ; ++i)
{
    fin >> x[i];
    aux.push_back(x[i]);
    //cout << x[i] << " ";
}
//cout << '\n';

sort(aux.begin() , aux.end());
aux.resize(distance(aux.begin() , unique(aux.begin() , aux.end())));

for (i = 1 ; i <= N ; ++i)
{
    x[i] = lower_bound(aux.begin() , aux.end() , x[i]) - aux.begin() + 1;
    //cout << x[i] << " ";
}


for (i = 1 ; i <= N ; ++i)
for (j = 1 ; j < i ; ++j)
{
    //if (x[i] == x[j]) continue;

    if (x[i] > x[j])
    {
        q = (1LL + query(j , 2000) - query(j , x[i])) % MOD;
        ans = (0LL + ans + q) % MOD;
        update(i , x[j] , q);
    }
    else
    {
        q = (1LL + query(j , x[i] - 1)) % MOD;
        ans = (0LL + ans + q) % MOD;
        update(i , x[j] , q);
    }
}

fout << ans << '\n';

return 0;
}