Advertisement
aayyk

Untitled

Oct 18th, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. //#pragma GCC optimize("Ofast,unroll-loops")
  2.  
  3. #ifdef LOCAL
  4. #include "debug.h"
  5. #else
  6. #include <bits/stdc++.h>
  7. #include <ext/pb_ds/assoc_container.hpp>
  8. #include <ext/pb_ds/tree_policy.hpp>
  9. #define debug(x...)
  10. #endif
  11.  
  12. using namespace std;
  13.  
  14. #define int ll
  15.  
  16. typedef long long ll;
  17. typedef long double ld;
  18. typedef pair <int, int> pii;
  19. #define sz(x) int((x).size())
  20.  
  21. template <typename T>
  22. using ordered_set = __gnu_pbds::tree <T, __gnu_pbds::null_type, less<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>;
  23.  
  24. #ifdef ONLINE_JUDGE
  25. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  26. #else
  27. mt19937 rng(1000 - 7);
  28. #endif
  29.  
  30. const int N = 1e5 + 10;
  31. //const int MOD = 998244353;
  32. const ll MOD = 1e9 + 9;
  33. const ld eps = 5e-8;
  34. const pii dir[] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
  35.  
  36. ll val[N], k[N], b[N];
  37. char used[N];
  38. int n, m, type[N];
  39. vector <int> g[N];
  40.  
  41. void dfs(int u) {
  42.     used[u] = 1;
  43.  
  44.     for (int v : g[u]) {
  45.         if (!used[v]) {
  46.             dfs(v);
  47.         }
  48.         if (type[u] == 1) {
  49.             k[u] = (k[u] + k[v]) % MOD;
  50.             b[u] = (b[u] + b[v]) % MOD;
  51.         }
  52.         if (type[u] == 2) {
  53.             if (k[v]) {
  54.                 assert(k[u] == 0);
  55.                 k[u] = k[v];
  56.                 b[u] = b[v];
  57.             }
  58.         }
  59.     }
  60.  
  61.     if (type[u] == 2) {
  62.         if (!k[u]) {
  63.             b[u] = 1;
  64.             for (int v : g[u]) {
  65.                 b[u] = (b[u] * b[v]) % MOD;
  66.             }
  67.         }
  68.         else {
  69.             for (int v : g[u]) {
  70.                 if (!k[v]) {
  71.                     k[u] = (k[u] * b[v]) % MOD;
  72.                     b[u] = (b[u] * b[v]) % MOD;
  73.                 }
  74.                 debug(k[v], b[v]);
  75.             }
  76.         }
  77.     }
  78.     if (type[u] == 3) {
  79.         k[u] = 1;
  80.         b[u] = 0;
  81.         assert(g[u].empty());
  82.     }
  83.     if (type[u] == 4) {
  84.         k[u] = 0;
  85.         b[u] = val[u];
  86.         assert(g[u].empty());
  87.     }
  88. }
  89.  
  90. signed main() {
  91. #ifdef LOCAL
  92.     freopen("input.txt", "r", stdin);
  93.     freopen("output.txt", "w", stdout);
  94. #endif
  95.     cout << fixed << setprecision(9);
  96.     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  97.  
  98.     int q;
  99.     cin >> n >> m >> q;
  100.  
  101.     for (int i = 0; i < n; i++) {
  102.         string s;
  103.         cin >> s;
  104.  
  105.         if (s == "+") {
  106.             type[i] = 1;
  107.         }
  108.         else if (s == "*") {
  109.             type[i] = 2;
  110.         }
  111.         else if (s == "x") {
  112.             type[i] = 3;
  113.         }
  114.         else {
  115.             type[i] = 4;
  116.             val[i] = stoi(s);
  117.         }
  118.     }
  119.  
  120.     for (int i = 0; i < m; i++) {
  121.         int u, v;
  122.         cin >> u >> v;
  123.  
  124.         g[v - 1].push_back(u - 1);
  125.     }
  126.  
  127.     dfs(0);
  128.  
  129.     for (int i = 0; i < n; i++) {
  130.         debug(i + 1, k[i], b[i]);
  131.     }
  132.  
  133.     while (q--) {
  134.         ll x;
  135.         cin >> x;
  136.  
  137.         cout << (k[0] * x + b[0]) % MOD << "\n";
  138.     }
  139.  
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement