Cod sursa(job #740974)

Utilizator mihai995mihai995 mihai995 Data 24 aprilie 2012 23:46:54
Problema Pedefe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.16 kb
#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;
}