제출 #1125047

#제출 시각아이디문제언어결과실행 시간메모리
1125047kirakosyanBirthday gift (IZhO18_treearray)C++20
56 / 100
719 ms73244 KiB
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#include<random>
#include<cmath>
#include<stack>
#include<map>
#include <iomanip> 
#include <queue>
#include <set>
using namespace std;
using ll = long long;
using ull = unsigned long long;
ll mod = 1e9 + 7;
ll pv(ll a, ll b) {
    if (b == 0)return 1;
    ll res = (pv(a, b / 2));
    if (b % 2) {
        return (((res * res) % mod) * (a % mod)) % mod;
    }
    else {
        return (res * res) % mod;
    }
}
ll gcd(ll n1, ll n2)
{
    if (n2 != 0)
        return gcd(n2, n1 % n2);
    else
        return n1;
}
vector<vector<int>>gp, up;
vector<int>tin, tout;
int timer = 0;
void dfs(int u, int p) {
    tin[u] = ++timer;
    up[u][0] = p;
    for (int i = 1; i < 14; i++) {
        up[u][i] = up[up[u][i - 1]][i - 1];
    }
    for (int& x : gp[u]) {
        if (x != p) {
            dfs(x, u);
        }
    }
    tout[u] = ++timer;

}
int stugel(int u, int v) {
    return (tin[u] <= tin[v] && tout[u] >= tout[v]);
}

int lca(int u, int v) {
    if (stugel(u, v)) {
        return u;
    }
    if (stugel(v, u)) {
        return v;
    }
    for (int i = 13; i >= 0; i--) {
        if (!(stugel(up[u][i], v))) {
            u = up[u][i];
        }
    }
    return up[u][0];
}
void solve() {
    int n, m, q; cin >> n >> m >> q;
    gp = vector<vector<int>>(n);
    up = vector<vector<int>>(n, vector<int>(14));
    tin = tout = vector<int>(n);
    vector<multiset<int>>adj(n),adj1(n);
    for (int i = 0; i < n - 1; i++) {
        int u, v; cin >> u >> v;
        --u, --v;
        gp[u].push_back(v);
        gp[v].push_back(u);
    }
    dfs(0, 0);
    vector<int>v(m);
    for (int i = 0; i < m; i++) {
        cin >> v[i];
        --v[i];
        adj1[v[i]].insert(i);
    }
    
    for (int i = 0; i < m - 1; i++) {
        adj[lca(v[i], v[i + 1])].insert(i);
    }
   
    for (int i = 0; i < q; i++) {
        int harc; cin >> harc;
        if (harc == 1) {
            int pos, v1; cin >> pos >> v1;
            --pos, --v1;
            adj1[v[pos]].erase(adj1[v[pos]].find(pos));
            if (pos < m - 1) {
                adj[lca(v[pos],v[pos+1])].erase(adj[lca(v[pos], v[pos + 1])].find(pos));
            }
            if (pos - 1 >= 0) {
                adj[lca(v[pos], v[pos - 1])].erase(adj[lca(v[pos], v[pos - 1])].find(pos - 1));
            }
            v[pos] = v1;
            adj1[v[pos]].insert(pos);
            if (pos < m - 1) {
                adj[lca(v[pos], v[pos + 1])].insert(pos);
            }
            if (pos - 1 >= 0) {
                adj[lca(v[pos], v[pos - 1])].insert(pos - 1);
            }
        }
        else {
            int l, r, v1; cin >> l >> r >> v1;
            --l, --r, --v1;
            int x1 = -1, y1 = -1;
            auto araj = adj1[v1].lower_bound(l);
            if (araj != adj1[v1].end()) {
                
                if (*araj <= r) {
                    x1 = *araj + 1;
                    y1 = *araj + 1;
                }

            }
            auto erk = adj[v1].lower_bound(l);
            if (erk != adj[v1].end()) {
                if (*erk + 1 <= r) {
                    x1 = *erk + 1;
                    y1 = *erk + 2;
                }
            }
            cout << x1 << " " << y1 << endl;
        }
    }

}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll _ = 1;
    //cin >> _;
    while (_--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...