Cod sursa(job #3258656)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 23 noiembrie 2024 12:16:32
Problema Pedefe Scor 0
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 1.68 kb
#include <bits/stdc++.h>
#define MOD 666013
using namespace std;
ifstream fin("pedefe.in");
ofstream fout("pedefe.out");
long long n,n1,n2,n3,v1[505],v2[505],v3[105],sol,aux,aib[505],i,j,k,l,pos1[105],pos2[105];
void update(int p, int val){
    for(;p<=500;p+=(p&-p))
        aib[p] = (aib[p]+val)%MOD;
}
long long query(int p){
    long long sum = 0;
    for(;p>0;p-=(p&-p))
        sum = (sum+aib[p])%MOD;
    return sum%MOD;
}
int main()
{
    fin>>n1>>n2>>n3;
    for(i=1;i<=n1;i++)
        fin>>v1[i];
    for(i=1;i<=n2;i++)
        fin>>v2[i];
    for(i=1;i<=n3;i++){
        fin>>v3[i];
        if(v3[i] < v3[i-1]){
            fout<<0;
            return 0;
        }
    }
    k=n3;
    for(i=n1;i>0;i--){
        if(v1[i] == v3[k]){
            pos1[k--] = i;
        }
    }
    k=n3;
    for(j=n2;j>0;j--){
        if(v2[j] == v3[k]){
            pos2[k--] = j;
        }
    }
    for(k=1;k<=n3;k++){
        for(i=pos1[k-1]+1;i<=pos1[k];i++){
            for(j=pos2[k-1]+1;j<=pos2[k];j++){
                if(v1[i] == v2[j] && v1[i] >= v3[k-1] && v1[i] <= v3[k]){
                    //cout<<"val: "<<v1[i]<<" query: "<<query(v1[i])<<'\n';
                    update(v1[i], 1);
                }
            }
        }
        aux = query(v3[k]);
        for(i=0;i<=500;i++) aib[i] = 0;
        update(v3[k], aux);
    }
    sol = query(v3[n3]);
    //cout<<'\n'<<sol;
    for(i=pos1[n3]+1;i<=n1;i++){
        for(j=pos2[n3]+1;j<=n2;j++){
            if(v1[i] == v2[j] && v1[i] >= v3[n3]){
                update(v1[i], 1);
                sol = max(sol, query(v1[i]));
            }
        }
    }
    fout<<sol%MOD;
    return 0;
}