Submission #1361185

#TimeUsernameProblemLanguageResultExecution timeMemory
1361185dex111222333444555Birthday gift (IZhO18_treearray)C++20
100 / 100
414 ms95132 KiB
#include <bits/stdc++.h>
#define all(v) begin(v), end(v)
#define ii pair<int, int>
#define fi first
#define se second
#define siz(v) (int)(v).size()
#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define dbg(x) "[" #x " = " << x << "]"

using namespace std;

const int MAXN = 2e5 + 5, LOG = 19;

int numNode, numVal, numQuery, val[MAXN], h[MAXN];
int tour[MAXN << 1], rtour[MAXN], st[LOG][MAXN << 1];
set<int > pos[MAXN], node[MAXN];
vector<int > adj[MAXN];

void input(){
    cin >> numNode >> numVal >> numQuery;

    for(int i = 1; i < numNode; i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    for(int i = 1; i <= numVal; i++){
        cin >> val[i];
    }
}

void dfsInit(int u, int par = 0){
    tour[++tour[0]] = u;
    rtour[u] = tour[0];

    for(int v: adj[u]) if (v != par){
        h[v] = h[u] + 1;
        dfsInit(v, u);
        tour[++tour[0]] = u;
    }
}

#define minHeight(a, b) (h[a] < h[b] ? a: b)

void sparseTable(){
    for(int i = 1; i <= tour[0]; i++) st[0][i] = tour[i];
    for(int j = 1; j < LOG; j++)
    for(int i = 1; i + MASK(j - 1) <= tour[0]; i++){
        st[j][i] = minHeight(st[j - 1][i], st[j - 1][i + MASK(j - 1)]);
    }
}

int lca(int u, int v){
    int l = rtour[u], r = rtour[v];
    if (l > r) swap(l, r);
    int k = __lg(r - l + 1);
    return minHeight(st[k][l], st[k][r - MASK(k) + 1]);
}

void del(const int &id){
    if (id > 1) pos[lca(val[id - 1], val[id])].erase(id - 1);
    if (id < numVal) pos[lca(val[id + 1], val[id])].erase(id);
}

void add(const int &id){
    if (id > 1) pos[lca(val[id - 1], val[id])].insert(id - 1);
    if (id < numVal) pos[lca(val[id + 1], val[id])].insert(id);
}

void solve(){
    dfsInit(1);
    sparseTable();
    for(int i = 1; i < numVal; i++){
        node[val[i]].insert(i);
        add(i);
    }
    node[val[numVal]].insert(numVal);
    for(int q = 1; q <= numQuery; q++){
        int type; cin >> type;

        if (type == 1){
            int id, v; cin >> id >> v;
            del(id);
            node[val[id]].erase(id);
            val[id] = v;
            node[val[id]].insert(id);
            add(id);

        }else{
            int l, r, v; cin >> l >> r >> v;
            set<int >::iterator it = pos[v].lower_bound(l), it2 = node[v].lower_bound(l);
            if ((it2 != end(node[v]) && *it2 <= r) && (it != end(pos[v]) && *it < r)){
                if (*it + 1 >= *it2){
                    cout << *it2 << ' ' << *it2 << '\n';
                }else{
                    cout << *it << ' ' << *it + 1 << '\n';
                }
            }else if (it2 != end(node[v]) && *it2 <= r){
                cout << *it2 << ' ' << *it2 << '\n';
            }else if (it != end(pos[v]) && *it < r){
                cout << *it << ' ' << *it + 1 << '\n';
            }else{
                cout << -1 << ' ' << -1 << '\n';
            }
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #define task "test"
    if (fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    int t = 1;
//    cin >> t;
    while(t--){
        input();
        solve();
    }
    cerr << (1.0 * clock()) / CLOCKS_PER_SEC << ".s\n";
}

Compilation message (stderr)

treearray.cpp: In function 'int main()':
treearray.cpp:115:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  115 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
treearray.cpp:116:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  116 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...