Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #pragma GCC optimize("O3")
- using namespace std;
- #define F first
- #define S second
- #define pb push_back
- #define m_t make_tuple
- #define m_p make_pair
- typedef long long ll;
- typedef long double ld;
- struct segtree {
- int n;
- vector<pair<int, int>> t[200200];
- void build(vector<pair<int, int>> &v) {
- for (int i = 0; i < n; i++) {
- t[n + i].push_back(v[i]);
- }
- for (int i = n - 1; i > 0; i--) {
- t[i].resize(t[i<<1].size() + t[i<<1|1].size());
- merge(t[i<<1].begin(), t[i<<1].end(), t[i<<1|1].begin(), t[i<<1|1].end(), t[i].begin());
- }
- initCustom();
- }
- void initCustom() {
- for (int i = 1; i < n + n; i++) {
- for (int j = 1; j < t[i].size(); j++) {
- t[i][j].S = min(t[i][j].S, t[i][j - 1].S);
- }
- }
- }
- int add(int v, int x) {
- int p = (int)(upper_bound(t[v].begin(), t[v].end(), m_p(x, (int)2e9)) - t[v].begin());
- if (p != 0) return t[v][p - 1].S;
- return 2e9;
- }
- int query(int l, int r, int x) {
- int ans = 1e9;
- for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
- if (l & 1) ans = min(ans, add(l++, x));
- if (r & 1) ans = min(ans, add(--r, x));
- }
- return ans;
- }
- segtree(vector<pair<int, int>> &v) {
- n = v.size();
- build(v);
- }
- };
- const int N = 100100;
- vector<pair<int, int>> all;
- vector<int> g[N];
- int h[N], tin[N], tout[N];
- int timer = 0;
- int a[N];
- void dfs(int v, int pr) {
- tin[v] = tout[v] = timer++;
- all.pb({h[v], a[v]});
- for (int to : g[v]) {
- if (to != pr) {
- h[to] = h[v] + 1;
- dfs(to, v);
- tout[v] = tout[to];
- }
- }
- }
- #define FILE "buffet"
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- // freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- int n, r;
- scanf("%d %d", &n, &r);
- for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
- for (int i = 1; i < n; i++) {
- int x, y;
- scanf("%d %d", &x, &y);
- g[x].pb(y);
- g[y].pb(x);
- }
- dfs(r, 0);
- segtree T(all);
- int last = 0;
- int m;
- scanf("%d", &m);
- while (m--) {
- int p, q;
- scanf("%d %d", &p, &q);
- int x = (p + last) % n + 1;
- int k = (q + last) % n;
- last = T.query(tin[x], tout[x] + 1, h[x] + k);
- printf("%d\n", last);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement