Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #pragma GCC optimize("O3")
  4.  
  5. using namespace std;
  6.  
  7. #define F first
  8. #define S second
  9. #define pb push_back
  10. #define m_t make_tuple
  11. #define m_p make_pair
  12.  
  13. typedef long long ll;
  14. typedef long double ld;
  15.  
  16. struct segtree {
  17. int n;
  18. vector<pair<int, int>> t[200200];
  19.  
  20. void build(vector<pair<int, int>> &v) {
  21. for (int i = 0; i < n; i++) {
  22. t[n + i].push_back(v[i]);
  23. }
  24. for (int i = n - 1; i > 0; i--) {
  25. t[i].resize(t[i<<1].size() + t[i<<1|1].size());
  26. merge(t[i<<1].begin(), t[i<<1].end(), t[i<<1|1].begin(), t[i<<1|1].end(), t[i].begin());
  27. }
  28. initCustom();
  29. }
  30.  
  31. void initCustom() {
  32. for (int i = 1; i < n + n; i++) {
  33. for (int j = 1; j < t[i].size(); j++) {
  34. t[i][j].S = min(t[i][j].S, t[i][j - 1].S);
  35. }
  36. }
  37. }
  38.  
  39. int add(int v, int x) {
  40. int p = (int)(upper_bound(t[v].begin(), t[v].end(), m_p(x, (int)2e9)) - t[v].begin());
  41. if (p != 0) return t[v][p - 1].S;
  42. return 2e9;
  43. }
  44.  
  45. int query(int l, int r, int x) {
  46. int ans = 1e9;
  47. for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
  48. if (l & 1) ans = min(ans, add(l++, x));
  49. if (r & 1) ans = min(ans, add(--r, x));
  50. }
  51. return ans;
  52. }
  53.  
  54. segtree(vector<pair<int, int>> &v) {
  55. n = v.size();
  56. build(v);
  57. }
  58. };
  59.  
  60. const int N = 100100;
  61.  
  62. vector<pair<int, int>> all;
  63. vector<int> g[N];
  64. int h[N], tin[N], tout[N];
  65. int timer = 0;
  66. int a[N];
  67.  
  68. void dfs(int v, int pr) {
  69. tin[v] = tout[v] = timer++;
  70. all.pb({h[v], a[v]});
  71. for (int to : g[v]) {
  72. if (to != pr) {
  73. h[to] = h[v] + 1;
  74. dfs(to, v);
  75. tout[v] = tout[to];
  76. }
  77. }
  78. }
  79. #define FILE "buffet"
  80. int main() {
  81. ios_base::sync_with_stdio(0);
  82. cin.tie(0);
  83. cout.tie(0);
  84. // freopen("input.txt", "r", stdin);
  85. //freopen("output.txt", "w", stdout);
  86.  
  87. int n, r;
  88. scanf("%d %d", &n, &r);
  89. for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  90.  
  91.  
  92. for (int i = 1; i < n; i++) {
  93. int x, y;
  94. scanf("%d %d", &x, &y);
  95. g[x].pb(y);
  96. g[y].pb(x);
  97. }
  98. dfs(r, 0);
  99. segtree T(all);
  100. int last = 0;
  101. int m;
  102. scanf("%d", &m);
  103. while (m--) {
  104. int p, q;
  105. scanf("%d %d", &p, &q);
  106. int x = (p + last) % n + 1;
  107. int k = (q + last) % n;
  108. last = T.query(tin[x], tout[x] + 1, h[x] + k);
  109. printf("%d\n", last);
  110. }
  111. return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement