Pagini recente » Cod sursa (job #2488880) | Cod sursa (job #2197074) | Cod sursa (job #376891) | Cod sursa (job #1207759) | Cod sursa (job #740974)
Cod sursa(job #740974)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int Nmax = 503, mod = 666013;
int v[Nmax][Nmax], aib[Nmax][Nmax], A[Nmax], B[Nmax], C[Nmax], Size;
struct Inter
{
int x, y, val;
inline bool operator<(const Inter& I) const
{
return val < I.val || ( val == I.val && x < I.x );
}
} ;
vector<Inter> lista[Nmax];
ifstream in("pedefe.in");
ofstream out("pedefe.out");
inline int step(int& x)
{
return x & (-x);
}
void get(int v[])
{
for (int i = 1 ; i <= v[0] ; i++)
in>>v[i];
}
int search(int v[], int x)
{
int i, step = 1 << 6;
for (i = 0 ; step ; step >>= 1)
if (i + step <= v[0] && v[i + step] <= x)
i += step;
return i;
}
void add(int x,int y,int val)
{
lista[search(C, val)].push_back((Inter){x, y, val});
}
bool fail_check(int C[])
{
for (int i = 2 ; i <= C[0] ; i++)
if (C[i] < C[i-1])
return true;
return false;
}
inline void add(int& x,int y)
{
x += y;
if (x<0)
x += mod;
if (mod <= x)
x -= mod;
}
void update(int x, int _y, int val)
{
for (; x <= A[0] ; x += step(x))
for (int y = _y ; y <= B[0] ; y += step(y))
add(aib[x][y], val);
}
int query(int x, int _y)
{
int rez = 0;
for (; x ; x -= step(x))
for (int y = _y ; y ; y-=step(y))
add(rez, aib[x][y]);
return rez;
}
void remove(vector<Inter>& lista)
{
for (vector<Inter>::iterator it = lista.begin() ; it != lista.end() ; it++)
update((*it).x, (*it).y, -v[ (*it).x ][ (*it).y ]);
}
void insert_exact(vector<Inter>& lista, int val)
{
int x, y;
for (vector<Inter>::iterator it = lista.begin() ; it != lista.end() ; it++)
{
if ((*it).val != val)
continue;
x = (*it).x;
y = (*it).y;
v[x][y] = 1 + query(x - 1, y - 1);
update(x, y, v[x][y]);
}
}
void insert(vector<Inter>& lista, int val)
{
int x, y;
for (vector<Inter>::iterator it = lista.begin() ; it != lista.end() ; it++)
{
if ((*it).val == val)
continue;
x = (*it).x;
y = (*it).y;
v[x][y] = (val == C[1]) + query(x - 1, y - 1);
update(x, y, v[x][y]);
}
}
int main()
{
in >> A[0] >> B[0] >> C[0];
get(A);
get(B);
get(C);
if (fail_check(C))
{
out<<"0\n";
return 0;
}
for (int i = 1 ; i <= A[0] ; i++)
for (int j = 1 ; j <= B[0] ; j++)
if (A[i] == B[j])
add(i, j, A[i]);
for (int i = 1 ; i <= C[0] ; i++)
if (!lista[i].empty())
sort(lista[i].begin(), lista[i].end());
for (int i = 1 ; i <= C[0] ; i++)
{
insert_exact(lista[i], C[i]);
remove(lista[i-1]);
insert(lista[i], C[i]);
}
for (int i = 1 ; i <= A[0] ; i++)
{
for (int j = 1 ; j <= B[0] ; j++)
cout << v[i][j] << " ";
cout << "\n";
}
out << query(A[0], B[0]) << "\n";
return 0;
}