Cod sursa(job #3282825)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 6 martie 2025 21:58:08
Problema Pedefe Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
using namespace std;
ifstream cin("pedefe.in");
ofstream cout("pedefe.out");
const int N=505,mod=666013;
int a[N],b[N],c[N],n,m,p,aib[N],sume[N],dp[2][N][N];
int pred,act;
void update(int poz,int val)
{
    for(int i=poz; i<N; i+=(i&-i))
    {
        aib[i]+=val;
        aib[i]%=mod;
    }
}
int query(int poz)
{
    int sum=0;
    for(int i=poz; i>0; i-=(i&-i))
    {
        sum+=aib[i];
        sum%=mod;
    }
    return sum;
}
void citeste()
{
    cin>>n>>m>>p;
    for(int i=1; i<=n; i++)
        cin>>a[i];
    for(int i=1; i<=m; i++)
        cin>>b[i];
    for(int i=1; i<=p; i++)
        cin>>c[i];
}
int main()
{
    citeste();
    for(int stare=0; stare<=p; stare++)
    {
        pred=((stare+1)%2);
        act=(stare%2);
        for(int i=1; i<N; i++)
        {
            aib[i]=0;
            sume[i]=0;
            for(int j=1; j<N; j++)
                dp[act][i][j]=0;
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=0; j<N; j++)
                aib[j]=0;

            for(int j=1; j<=m; j++)
            {
                if(a[i]==b[j])
                {
                    if(a[i]==c[stare+1])
                    {
                        dp[act][i][j]=((dp[act][i][j]+query(a[i])+(stare==0)))%mod;
                    }
                    else
                        dp[pred][i][j]=((dp[pred][i][j]+query(a[i])+(stare==0)))%mod;
                }
                update(b[j],sume[j]);
                sume[j]+=dp[pred][i][j];
                sume[j]%=mod;
            }
        }
    }
    int ind=(p+1)%2;
    int ans=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            ans+=dp[ind][i][j];
            ans%=mod;
        }
    cout<<ans;
    return 0;
}