Cod sursa(job #3224243)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 14 aprilie 2024 23:19:17
Problema P-sir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;

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

const int mod = (1ll << 32) - 1;
const int nmax = 2005;
int v[nmax],d[nmax];
int last_pos[nmax];
int n;

int aib[nmax];
void update(int p, int val)
{
    if(p == 0) return;
    while(p < nmax)
    {
        aib[p] += val;
        aib[p] &= mod;
        p += p & (-p);
    }
}
int query(int p)
{
    int ret = 0;
    while(p > 0)
    {
        ret += aib[p];
        ret &= mod;
        p -= p & (-p);
    }
    return ret;
}

inline void citire()
{
    fin>>n;
    int cnt=1;
    map<int,int> norm;
    for(int i=1; i<=n; i++)
    {
        fin>>v[i];
        norm[v[i]] = 1;
    }
    for(auto [i,j] : norm)
    {
        norm[i] = cnt++;
    }
    for(int i=1; i<=n; i++)
    {
        v[i] = norm[v[i]];
        //cout<<v[i]<<" ";
    }
}

signed main()
{
    citire();
    for(int i=1; i<=n; i++)
    {
        d[i] = 1;
        memset(aib,0,sizeof aib);
        cout<<"deleted\n";
        cout<<v[i]<<":\n";
        for(int j=1; j<i; j++)
        {
            if(v[i] != v[j]) d[i] ++;
            cout<<v[j]<<"-> ";
            if(v[j] > v[i])
            {
                cout<<query(v[i] - 1)<<" ";
                d[i] += query(v[i] - 1);
            }
            else if(v[j] < v[i])
            {
                cout<<query(nmax - 1)<<" - "<<query(v[i])<<" - "<<d[last_pos[v[i]]]<<" ";
                d[i] += query(nmax - 1) - query(v[i]) - d[last_pos[v[i]]];
            }
            cout<<"\n";
            update(v[j],d[j]);
            cout<<"updated: "<<v[j]<<" "<<d[j]<<"\n";
            d[i] &= mod;
        }
        last_pos[v[i]] = i;
    }

    int total = 0;
    for(int i=1; i<=n; i++)
    {
        d[i] --; //scoatem cel de lungime 1
        for(int j=i+1; j<=n; j++)
        {
            if(v[i] == v[j]) d[j] ++; //identice
        }
        d[i] &= mod;
    }

    for(int i=1; i<=n; i++)
    {
        cout<<d[i]<<" ";
        total += d[i];
        total &= mod;
    }
    fout<<total;
    return 0;
}