// Author: Bartek Knapik
#include <cstdio>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <utility>
using namespace std;
const int MAX_N = 200000 + 9;
int n, m, q, a, b, v, k, cmd;
long long d, z;
int color[MAX_N];
bool visited[MAX_N];
unordered_map<long long, long long> edges;
unordered_set<int> adj[MAX_N];
void dfs(int _v, long long _z, int _k)
{
if (_z < 0) return;
color[_v] = _k;
visited[_v] = true;
for (auto it = adj[_v].begin(); it != adj[_v].end(); ++it)
{
if (visited[*it]) continue;
a = _v;
b = *it;
if (b > a) { int tmp = a; a = b; b = tmp; }
dfs(*it, _z - edges[((long long)a << 20) + (long long)b], _k);
}
}
void add()
{
scanf("%d%d%lld", &a, &b, &d);
adj[a].insert(b);
adj[b].insert(a);
if (b > a) { int tmp = a; a = b; b = tmp; }
edges[((long long)a << 20) + (long long)b] = d;
}
void rem()
{
scanf("%d%d", &a, &b);
adj[a].erase(b);
adj[b].erase(a);
if (b > a) { int tmp = a; a = b; b = tmp; }
edges.erase(((long long)a << 20) + (long long)b);
}
void col()
{
scanf("%d%lld%d", &v, &z, &k);
for (int i = 0; i < MAX_N; ++i) visited[i] = false;
dfs(v, z, k);
}
void ask()
{
scanf("%d", &a);
printf("%d\n", color[a]);
}
int main()
{
scanf("%d%d%d", &n, &m, &q);
for (int i = 0; i < m; ++i)
add();
for (int i = 0; i < q; ++i)
{
scanf("%d", &cmd);
if (cmd == 1) add();
else if (cmd == 2) rem();
else if (cmd == 3) col();
else ask();
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | // Author: Bartek Knapik #include <cstdio> #include <queue> #include <unordered_map> #include <unordered_set> #include <utility> using namespace std; const int MAX_N = 200000 + 9; int n, m, q, a, b, v, k, cmd; long long d, z; int color[MAX_N]; bool visited[MAX_N]; unordered_map<long long, long long> edges; unordered_set<int> adj[MAX_N]; void dfs(int _v, long long _z, int _k) { if (_z < 0) return; color[_v] = _k; visited[_v] = true; for (auto it = adj[_v].begin(); it != adj[_v].end(); ++it) { if (visited[*it]) continue; a = _v; b = *it; if (b > a) { int tmp = a; a = b; b = tmp; } dfs(*it, _z - edges[((long long)a << 20) + (long long)b], _k); } } void add() { scanf("%d%d%lld", &a, &b, &d); adj[a].insert(b); adj[b].insert(a); if (b > a) { int tmp = a; a = b; b = tmp; } edges[((long long)a << 20) + (long long)b] = d; } void rem() { scanf("%d%d", &a, &b); adj[a].erase(b); adj[b].erase(a); if (b > a) { int tmp = a; a = b; b = tmp; } edges.erase(((long long)a << 20) + (long long)b); } void col() { scanf("%d%lld%d", &v, &z, &k); for (int i = 0; i < MAX_N; ++i) visited[i] = false; dfs(v, z, k); } void ask() { scanf("%d", &a); printf("%d\n", color[a]); } int main() { scanf("%d%d%d", &n, &m, &q); for (int i = 0; i < m; ++i) add(); for (int i = 0; i < q; ++i) { scanf("%d", &cmd); if (cmd == 1) add(); else if (cmd == 2) rem(); else if (cmd == 3) col(); else ask(); } return 0; } |
English