Cod sursa(job #1672320)

Utilizator tudortarniceruTudor Tarniceru tudortarniceru Data 2 aprilie 2016 16:25:06
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.07 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream fin("culegere.in");
ofstream fout("culegere.out");
const int MAXN = 500005;
const int MAXD = 2000005;
int n, m;
int lg, qs;
int v[2005][2005];
int a[2005][2005];
int c[3][MAXD];
struct qstr{
    int p;
    int sf;
} dp[MAXN];
struct qst{
    int t;
    int l;
    int c;
    int in;
    int sf;
    int s;
} q[MAXN];
int srt(qstr a, qstr b) {
    return a.sf < b.sf;
}
int sfm;
int st, dr;
int se;
int d1[10], d2[10];
int main() {
    d1[1] = -1; d1[2] = 0; d1[3] = 1; d1[4] = 0;
    d2[1] = 0; d2[2] = 1; d2[3] = 0; d2[4] = -1;
    fin >> n >> m >> lg >> qs;
    st = 1; dr = lg;
    for (int i = 1; i <= lg; ++i) {
        c[1][i] = 1;
        c[2][i] = i;
        v[1][i] = 1;
    }
    se = 2;
    for (int i = 1; i <= qs; ++i) {
        fin >> q[i].t >> q[i].l >> q[i].c >> q[i].in >> q[i].sf;
        if (q[i].t == 2) {
            fin >> q[i].s;
        }
        dp[i].p = i;
        dp[i].sf = q[i].sf;
        sfm = max(sfm, q[i].sf);
    }
    sort(dp + 1, dp + qs + 1, srt);
    int var = 1;
    int s = 1;
    int q1 = 1;
    int q2 = 1;
    while (var == 1 && s <= sfm) {
        while (s == dp[q1].sf) {
            int k = dp[q1].p;
            if (q[k].t == 1) {
                if (a[q[k].l][q[k].c] == 5) {
                    a[q[k].l][q[k].c] = 0;
                }
            }
            else {
                a[q[k].l][q[k].c] = 0;
            }
            q1++;
        }
        while (s == q[q2].in) {
            if (q[q2].t == 1) {
                a[q[q2].l][q[q2].c] = 5;
            }
            else {
                a[q[q2].l][q[q2].c] = q[q2].s;
            }
            q2++;
        }
        int ls = c[1][dr] + d1[se];
        int cs = c[2][dr] + d2[se];
        if (ls < 1) {
            ls = n;
        }
        else if (ls > n) {
            ls = 1;
        }
        if (cs < 1) {
            cs = m;
        }
        else if (cs > m) {
            cs = 1;
        }
        if (v[ls][cs] == 1) {
            var = 2;
        }
        else {
            dr++;
            c[1][dr] = ls;
            c[2][dr] = cs;
            v[ls][cs] = 1;
            if (a[ls][cs] == 5) {
                a[ls][cs] = 0;
            }
            else {
                v[c[1][st]][c[2][st]] = 0;
                st++;
                if (a[ls][cs] >= 1 && a[ls][cs] <= 4) {
                    se = a[ls][cs];
                }
            }
        }
        s++;
    }
    if (var == 1) {
        fout << "LIBER";
    }
    else {
        fout << "BLOCAT";
    }
    fout << '\n';
    v[c[1][dr]][c[2][dr]] = 2;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            if (v[i][j] == 0) {
                fout << '.';
            }
            else if (v[i][j] == 1) {
                fout << 'O';
            }
            else {
                fout << '#';
            }
        }
        fout << '\n';
    }
    fout.close();
    return 0;
}