fork download
  1. #include <bits/stdc++.h> // NeOWami
  2. using namespace std;
  3. // _oo0oo_
  4. // o8888888o
  5. // 88" . "88
  6. // (| -_- |)
  7. // 0\ = /0
  8. // ___/`---'\___
  9. // .' \\| |// '.
  10. // / \\||| : |||// \
  11. // / _||||| -:- |||||- \
  12. // | | \\\ - /// | |
  13. // | \_| ''\---/'' |_/ |
  14. // \ .-\__ '-' ___/-. /
  15. // ___'. .' /--.--\ `. .'___
  16. // ."" '< `.___\_<|>_/___.' >' "".
  17. // | | : `- \`.;`\ _ /`;.`/ - ` : | |
  18. // \ \ `_. \_ __\ /__ _/ .-` / /
  19. // =====`-.____`.___ \_____/___.-`___.-'=====
  20. // `=---='
  21. //
  22. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23. // Phật phù hộ, không bao giờ BUG
  24. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  25.  
  26. #define ft first
  27. #define sc second
  28. #define int long long
  29. using pii = pair<int, int>;
  30. const int N = 2e5 + 5;
  31. const int MOD = 998244353;
  32. void add(int &u, int v) {
  33. u += v;
  34. if (u >= MOD) u -= MOD;
  35. }
  36. int n, m;
  37. int a[N];
  38. int valEdge[N];
  39. vector<pii> G[N];
  40. pii E[N];
  41. map<int, int> dp[N];
  42.  
  43. int DP(int id) {
  44. if (valEdge[id] != -1) return valEdge[id];
  45. int u = E[id].ft, v = E[id].sc;
  46. int need = a[v] - a[u], val = 0;
  47. if (need >= 1) {
  48. if (!dp[u].count(need)) {
  49. int cnt = 0;
  50.  
  51. for (int id = lower_bound(G[u].begin(), G[u].end(), (pii){need, 0}) - G[u].begin(); id < G[u].size() && G[u][id].ft == need; id++) add(cnt, DP(G[u][id].sc));
  52. dp[u][need] = cnt;
  53. val = cnt;
  54. }
  55. else val = dp[u][need];
  56. }
  57. return valEdge[id] = (val + 1) % MOD;
  58. }
  59. void solve(){
  60. int ans = 0;
  61. cin >> n >> m;
  62. for (int i = 1; i <= n; i++) cin >> a[i];
  63. for (int i = 1; i <= m; i++) {
  64. int u, v; cin >> u >> v;
  65. G[v].push_back({a[u], i});
  66. E[i] = {u, v};
  67. valEdge[i] = -1;
  68. }
  69.  
  70. for (int i = 1; i <= n; i++) sort(G[i].begin(), G[i].end());
  71. for (int i = 1; i <= m; i++) add(ans, DP(i));
  72. for (int i = 1; i <= n; i++) {
  73. G[i].clear();
  74. dp[i].clear();
  75. }
  76. cout << ans << "\n";
  77. }
  78.  
  79. signed main() {
  80. cin.tie(NULL)->sync_with_stdio(false);
  81. if(ifstream("Input.inp")) {
  82. freopen("Input.inp", "r", stdin);
  83. freopen("Output.out", "w", stdout);
  84. }
  85.  
  86. int tt;
  87. cin >> tt;
  88. while(tt--){
  89. solve();
  90. }
  91.  
  92. return 0;
  93. }
Success #stdin #stdout 0.01s 20212KB
stdin
Standard input is empty
stdout
Standard output is empty