Cod sursa(job #1769479)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 2 octombrie 2016 16:39:20
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 550
#define MAXP 110
#define MOD 666013

using namespace std;

int n, m, p;
int s1[MAXN], s2[MAXN], s3[MAXP];
int aib[MAXN];

void citire()
{
	scanf("%d %d %d", &n, &m, &p);
    for (int i = 1; i <= n; i++)
		scanf("%d", &s1[i]);
    for (int i = 1; i <= m; i++)
		scanf("%d", &s2[i]);
	for (int i = 1; i <= p; i++)
		scanf("%d", &s3[i]);
}

int a[2][MAXN][MAXN];
int sum[MAXN];

int modSum(int e, int f)
{
    int r = e+f;
    if (r >= MOD) r -= MOD;
    return r;
}

inline int zero(int x)
{
    return x & (x ^ (x-1));
}

void update(int ind, int val)
{
    for (int i = ind; i < MAXN; i += zero(i))
        aib[i] = modSum(aib[i], val);
}

int query(int ind)
{
	int to = 0;
    for (int i = ind; i > 0; i -= zero(i))
		to = modSum(to, aib[i]);
	return to;
}

void solve()
{
    int crt = 1;
    for (int k = 0; k <= p; k++)
	{
		crt ^= 1;
		memset(sum, 0, sizeof sum);
		for (int i = 1; i <= n; i++) {
			memset(aib, 0, sizeof aib);
			if (k == 0)
                update(1, 1);
			for (int j = 1; j <= m; j++) {
				a[!crt][i][j] = 0;
                if (s1[i] == s2[j]) {
					int val = query(s1[i]);
					if (k == p || s3[k+1] != s1[i])
						a[crt][i][j] += val;
					else
						a[!crt][i][j] = val;
                }
                else
					a[crt][i][j] = 0;
				update(s2[j], sum[j]);
                sum[j] = modSum(sum[j], a[crt][i][j]);
			}
		}
	}
	int rez = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			rez = modSum(rez, a[crt][i][j]);
	printf("%d", rez);
}

int main()
{
    freopen("pedefe.in", "r", stdin);
    freopen("pedefe.out", "w", stdout);

	citire();
	solve();

    return 0;
}