Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 1e6 + 13;
  6.  
  7. inline void boost () {
  8. ios_base::sync_with_stdio (0);
  9. cin.tie (0), cout.tie (0);
  10. }
  11. int n, c[N], q;
  12. string s[N];
  13.  
  14. struct trie {
  15. int nxt[27], sum;
  16. trie () {
  17. memset (nxt, 0, sizeof nxt);
  18. sum = 0;
  19. }
  20. } t[N];
  21. int sz = 1;
  22. int pos[N], dp[N];
  23.  
  24. void add (int i) {
  25. int v = 1;
  26. for (auto it : s[i]) {
  27. int to = it - 'a';
  28. if (!t[v].nxt[to])
  29. t[v].nxt[to] = ++ sz;
  30. v = t[v].nxt[to];
  31. }
  32. t[v].sum += c[i];
  33. pos[i] = v;
  34. }
  35. int timer, tin[N], tout[N], pr[25][N];
  36.  
  37. void dfs (int v = 1, int par = -1) {
  38. tin[v] = ++ timer;
  39. dp[v] += t[v].sum;
  40. pr[0][v] = par;
  41. for (int i = 1;i <= 23;i ++)
  42. pr[i][v] = pr[i - 1][pr[i - 1][v]];
  43. for (int to = 0;to < 26;to ++) {
  44. if (!t[v].nxt[to])
  45. continue;
  46. dfs (t[v].nxt[to], v);
  47. }
  48. tout[v] = ++ timer;
  49. }
  50. struct node {
  51. int val, add;
  52. node () {
  53. val = add = 0;
  54. }
  55. };
  56. vector < node > T;
  57.  
  58. void push (int v, int tl, int tr) {
  59. if (!T[v].add) return;
  60. T[v].val += (tr - tl + 1) * T[v].add;
  61. if (tl != tr) {
  62. T[v + v].add += T[v].add;
  63. T[v + v + 1].add += T[v].add;
  64. }
  65. T[v].add = 0;
  66. }
  67. void upd (int l, int r, int val, int v = 1, int tl = 1, int tr = timer) {
  68. push (v, tl, tr);
  69. if (tl > r || tr < l || l > r || tl > tr) return;
  70. if (l <= tl && tr <= r) {
  71. T[v].add += val;
  72. push (v, tl, tr);
  73. return;
  74. }
  75. int tm = (tl + tr) >> 1;
  76. upd (l, r, val, v + v, tl, tm);
  77. upd (l, r, val, v + v + 1, tm + 1, tr);
  78. T[v].val = T[v + v].val + T[v + v + 1].val;
  79. }
  80. int get (int l, int r, int v = 1, int tl = 1, int tr = timer) {
  81. push (v, tl, tr);
  82. if (tl > r || tr < l || l > r || tl > tr) return 0;
  83. if (l <= tl && tr <= r) return T[v].val;
  84. int tm = (tl + tr) >> 1;
  85. return get (l, r, v + v, tl, tm) + get (l, r, v + v + 1, tm + 1, tr);
  86. }
  87. int parent (int v, int k) {
  88. for (int i = 23;i >= 0;i --)
  89. if (((1 << i) & k))
  90. v = pr[i][v];
  91. return pr[0][v];
  92. }
  93.  
  94. int main () {
  95. boost ();
  96. cin >> n >> q;
  97. for (int i = 1;i <= n;i ++) cin >> s[i] >> c[i];
  98. for (int i = 1;i <= n;i ++) add (i);
  99. dfs ();
  100. T.resize (4 * n + 123);
  101. while (q --) {
  102. char tp;
  103. cin >> tp;
  104. if (tp == '?') {
  105. int x, k;
  106. cin >> x >> k;
  107. int vk = parent (x, k - 1);
  108. cout << dp[pos[x]] + get (tin[pos[x]], tin[pos[x]]) - (dp[vk] + get (tin[vk], tin[vk])) << endl;
  109. } else {
  110. int x, val;
  111. cin >> x >> val;
  112. upd (tin[pos[x]], tout[pos[x]], val);
  113. }
  114. }
  115.  
  116. return 0;
  117. }
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177. //made up by Dalen
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement