Cod sursa(job #3346050)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 12 martie 2026 11:29:44
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <list>
#include <cstring>
#define NMAX 16009
using namespace std;
ifstream fin("omizi.in");
ofstream fout("omizi.out");
int N, M;
list<int> G[NMAX];
int tt[NMAX];
char dir[NMAX];
int whichOm[NMAX];
int ansArr[NMAX];
bool fullNode[NMAX];
struct interval { int L, R; };
const interval NIL = { -1, -1 };
interval combine(interval a, interval b) {
    if (a.L == -1) return b;
    if (b.L == -1) return a;
    return { a.L, b.R };
}
interval dfs(int node) {
    interval cur = NIL;
    for (int x : G[node]) cur = combine(cur, dfs(x));
    if (cur.L == -1) {
        if (dir[node]) {
            ansArr[ whichOm[node] ] = node;
            fullNode[node] = true;
            return NIL;
        }
        return { node, node };
    }
    if (dir[node]) {
        bool eq = (cur.L == cur.R);
        if (dir[node] == 'S') {
            ansArr[ whichOm[node] ] = cur.L;
            fullNode[cur.L] = true;
            cur.L = tt[cur.L];
            while (!G[cur.L].empty()) {
                if (fullNode[ G[cur.L].front() ]) G[cur.L].pop_front();
                else { cur.L = G[cur.L].front(); break; }
            }
            if (eq) cur.R = cur.L;
        } else {
            ansArr[ whichOm[node] ] = cur.R;
            fullNode[cur.R] = true;
            cur.R = tt[cur.R];
            while (!G[cur.R].empty()) {
                if (fullNode[ G[cur.R].back() ]) G[cur.R].pop_back();
                else { cur.R = G[cur.R].back(); break; }
            }
            if (eq) cur.L = cur.R;
        }
    }
    return cur;
}
int main() {
    int i, x;
    char c;
    memset(tt, 0, sizeof(tt));
    memset(dir, 0, sizeof(dir));
    memset(whichOm, 0, sizeof(whichOm));
    memset(fullNode, 0, sizeof(fullNode));
    fin >> N >> M;
    for (i = 1; i <= N; ++i) {
        fin >> x;
        while (x) {
            G[i].push_back(x);
            tt[x] = i;
            fin >> x;
        }
    }
    for (i = 1; i <= M; ++i) {
        fin >> x >> c;
        whichOm[x] = i;
        dir[x] = c;
    }
    dfs(1);
    for (i = 1; i <= M; ++i) fout << ansArr[i] << '\n';
    return 0;
}