Pagini recente » Cod sursa (job #23118) | Cod sursa (job #3327052) | Cod sursa (job #1479685) | Cod sursa (job #866589) | Cod sursa (job #3346050)
#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;
}