Cod sursa(job #2042813)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 19 octombrie 2017 11:14:10
Problema P-sir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<fstream>
#include<algorithm>
#define mod (1LL << 32)
using namespace std;
unsigned int n, i, j, nr, sol;
long long val;
unsigned int v[2005], w[2005], aib[2005][2005];
ifstream fin("psir.in");
ofstream fout("psir.out");
void update(int t, int x, long long val){
    for(; x <= nr; x += (x & -x)){
        aib[t][x] = (val + aib[t][x]) & (mod - 1);
    }
}
long long query(int t, int x){
    long long sum = 0;
    for(; x >= 1; x -= (x & -x)){
        sum = (sum + aib[t][x]) & (mod - 1);
    }
    return sum;
}
int main(){
    fin>> n;
    for(i = 1; i <= n; i++){
        fin>> v[i];
        w[i] = v[i];
    }
    sort(w + 1, w + n + 1);
    nr = 1;
    for(i = 2; i <= n; i++){
        if(w[i] != w[nr]){
            w[++nr] = w[i];
        }
    }
    for(i = 1; i <= n; i++){
        for(j = 1; j <= nr; j++){
            if(v[i] == w[j]){
                v[i] = j;
            }
        }
    }
    for(i = 2; i <= n; i++){
        for(j = i - 1; j >= 1; j--){
            val = 1;
            if(v[i] < v[j]){
                val = (val + query(j, v[i - 1]) ) & (mod - 1);
            }
            else{
                if(v[i] > v[j]){
                    val = (val + query(j, nr) - query(j, v[i]) ) & (mod - 1);
                }
            }
            sol = (val + sol) & (mod - 1);
            update(i, v[j], val);
        }
    }
    fout<< sol <<"\n";
    return 0;
}