Submission #375788


Source Code Expand

#include <bits/stdc++.h>
#define all(x) begin(x),end(x)
#define rall(x) (x).rbegin(),(x).rend()
#define REP(i,b,n) for(int i=(int)(b);i<(int)(n);++i)
#define rep(i,n) REP(i,0,n)
#define repsz(i,v) rep(i,(v).size())
#define aur auto&
#define bit(n) (1LL<<(n))
#define eb emplace_back
#define mt make_tuple
#define fst first
#define snd second
using namespace std;
typedef long long ll;
//#define int long long
template<class C>int size(const C &c){ return c.size(); }
template<class T>bool chmin(T&a,const T&b){if(a<=b)return false;a=b;return true;}
template<class T>bool chmax(T&a,const T&b){if(a>=b)return false;a=b;return true;}

struct ETT{//{{{
    struct Node{//{{{
        using Ptr = Node *;
        using NData = tuple<ll, int>;      // node data
        using TData = tuple<ll, int>; // subtree data (calc in 'update')
        NData ndata;
        TData tdata;
        Ptr l, r, p, rev;
        int size;
        Node(const NData &ndata, Ptr l = nullptr, Ptr r = nullptr)
            : ndata(ndata), l(l), r(r), p(nullptr), rev(nullptr), size(1){}
        Ptr &ch(const int &dir){ return dir > 0 ? r : l; }
    };//}}}

    friend ostream &operator<<(ostream &os, const Node *u){
        if(u == nullptr) return os << "nullptr";
        return os << (get<0>(u->ndata) > (1LL<<30) ? "v " : "e ") << get<1>(u->ndata) << "  (" << static_cast<const void*>(u) << ")";
    }

    using NData = Node::NData;
    using TData = Node::TData;
    using Ptr   = Node::Ptr;

    static inline Ptr update(const Ptr &u){
        if(u == nullptr) return u;
        u->size = 1 + size(u->l) + size(u->r);
        // write code here!
        u->tdata = u->ndata;
        if(u->l) chmin(u->tdata, u->l->tdata);
        if(u->r) chmin(u->tdata, u->r->tdata);
        return u;
    }
    static inline Ptr push(const Ptr &u){
        if(u == nullptr) return u;
        // write code here!
        return u;
    }

    static inline int size(const Ptr &u){ return u == nullptr ? 0 : u->size; }
    static inline Ptr new_node(const NData &ndata,
            Ptr l = nullptr, Ptr r = nullptr){
        Ptr u = new Node(ndata);
        add_ch(u, 0, l); add_ch(u, 1, r);
        return update(u);
    }
    static inline void delete_node(Ptr p){ delete p; }
    // splay tree//{{{
    static inline int state(Ptr u){ return u->p ? (u->p->l == u ? -1 : +1) : 0; }
    static inline void rotate(Ptr u){ //{{{
        Ptr p = u->p, pp = p->p;
        if(pp) push(pp); push(p); push(u);
        int lr = state(u);
        if(pp != nullptr) pp->ch(state(p)) = u;
        u->p = pp;
        if(u->ch(-lr)) u->ch(-lr)->p = p;
        p->ch(lr) = u->ch(-lr);
        p->p = u;
        u->ch(-lr) = p;
        update(p); update(u); update(pp);
    }//}}}
    static inline Ptr splay(Ptr u){//{{{
        for(; state(u); rotate(u)) if(int s = state(u) * state(u->p))
            rotate(s == 1 ? u->p : u);
        return u;
    }//}}}
    static inline Ptr add_ch(Ptr p, int dir, Ptr c){//{{{
        push(p);
        if(c) c->p = p;
        p->ch(dir) = c;
        return update(p);
    }//}}}
    static inline Ptr remove_ch(Ptr u, int dir){//{{{
        Ptr v = u->ch(dir);
        if(v != nullptr) u->ch(dir) = v->p = nullptr;
        update(u);
        return v;
    }//}}}
    static inline Ptr join(Ptr u, Ptr v){//{{{
        if(u == nullptr or v == nullptr) return u ? u : v;
        for(splay(u); u->r; u = u->r) void();
        return add_ch(splay(u), 1, splay(v));
    }//}}}
//}}}
    // euler tour tree
    static Ptr add_vertex(const NData &ndata){ return new_node(ndata); }
    static Ptr add_edge(const Ptr &u, const Ptr &v, const NData &ndata){//{{{
        // tr << "link " << u << ", " << v << endl;
        // tr << "u = " << endl; prt(u);
        // tr << "v = " << endl; prt(v);
        splay(u); splay(v);
        Ptr uv = new_node(ndata, u, remove_ch(v, 1));
        Ptr vu = new_node(ndata, v, remove_ch(u, 1));
        uv->rev = vu; vu->rev = uv;
        join(uv, vu);
        // tr << "result = " << endl; prt(uv); tr << endl;
        return uv;
    }//}}}

    //static void prt(Ptr u, int d){
    //    if(u == nullptr) return;
    //    prt(u->l, d+4);
    //    tr << string(d, ' ') << u << endl;
    //    prt(u->r, d+4);
    //}
    //static void prt(Ptr u){
    //    while(u->p) u = u->p;
    //    prt(u, 0);
    //}

    static void remove_edge(Ptr uv){//{{{
        // tr << "cut edge " << uv << endl;
        // tr << "uv =" << endl; prt(uv);
        Ptr vu = uv->rev;
        assert(vu != nullptr && "assert in 'remove_edge': uv is not edge.");
        splay(uv);
        Ptr t = vu;
        while(t->p != uv) t = t->p;
        if(uv->l == t){ swap(uv, vu); splay(uv); }
        // tr << "uv = " << uv << ", vu = " << vu << endl;
        // vu is right of uv. (i.e. after than uv)
        remove_ch(uv, 1);
        Ptr A = join(remove_ch(splay(vu), 1), remove_ch(uv, 0));
        Ptr B = remove_ch(splay(vu), 0);
        // tr << "A =" << endl; prt(A);
        // tr << "B =" << endl; prt(B); tr << endl;
        delete_node(uv); delete_node(vu);
    }//}}}

    static TData get_data(Ptr u){ return splay(u)->tdata; }
    static void set_data(Ptr u, const NData &ndata){
        splay(u)->ndata = ndata;
        update(u);
    }
};//}}}
struct ETTManager{//{{{
    using NData = ETT::NData;
    using TData = ETT::TData;
    using Ptr   = ETT::Ptr;
    vector<ETT::Ptr> vs;
    map<pair<int, int>, ETT::Ptr> es;
    ETTManager(int n, const NData &ndata) : vs(n, nullptr){
        for(auto &v : vs) v = ETT::add_vertex(ndata);
    }
    void add_edge(int u, int v, const NData &ndata){
        es[std::minmax(u, v)] = ETT::add_edge(vs[u], vs[v], ndata);
    }
    void remove_edge(int u, int v){
        const auto &key = std::minmax(u, v);
        ETT::remove_edge(es[key]);
        es.erase(key);
    }
    bool has_edge(int u, int v){ return es.count(std::minmax(u, v)); }
    TData get_data(int u){ return ETT::get_data(vs[u]); }
    void set_data(int u, const NData &ndata){
        ETT::set_data(vs[u], ndata); }
    void set_data(int u, int v, const NData &ndata){
        ETT::set_data(es[std::minmax(u, v)], ndata);
        ETT::set_data(es[std::minmax(u, v)]->rev, ndata);
    }
};//}}}

bool solve(){
    int n;
    cin >> n;
    constexpr ll INF = 1LL<<40;
    ETTManager g(n, make_tuple(INF, INF));
    rep(u, n) g.set_data(u, make_tuple(INF, u));
    vector<tuple<int, int, ll>> es;
    rep(i, n-1){
        int a, b, c;
        cin >> a >> b >> c;
        --a; --b;
        if(a > b) swap(a, b);
        g.add_edge(a, b, make_tuple(c, i));
        es.emplace_back(a, b, c);
    }
    int q;
    cin >> q;
    rep(_, q){
        int op;
        cin >> op;
        if(op == 1){
            int i; ll d; cin >> i >> d; --i;
            get<2>(es[i]) += d;
            if(!g.has_edge(get<0>(es[i]), get<1>(es[i]))) continue;
            g.set_data(get<0>(es[i]), get<1>(es[i]),
                    make_tuple(get<2>(es[i]), i));
        }else{
            int i; cin >> i; --i;
            if(!g.has_edge(get<0>(es[i]), get<1>(es[i]))){
                cout << -1 << endl;
                continue;
            }
            i = get<1>(g.get_data(get<0>(es[i])));
            g.remove_edge(get<0>(es[i]), get<1>(es[i]));
            cout << i+1 << endl;
        }
    }
    return true;
}
signed main(){
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    cout << std::fixed << std::setprecision(10);
    solve();
    return 0;
}
// vim:set foldmethod=marker commentstring=//%s:

Submission Info

Submission Time
Task I - 盆栽
User MiSawa
Language C++11 (GCC 4.9.2)
Score 300
Code Size 7741 Byte
Status AC
Exec Time 1362 ms
Memory 33048 KB

Judge Result

Set Name Subtask All
Score / Max Score 30 / 30 270 / 270
Status
AC × 17
AC × 50
Set Name Test Cases
Subtask atetubou-challenge1.in, subtask_00.txt, subtask_01.txt, subtask_02.txt, subtask_03.txt, subtask_04.txt, subtask_05.txt, subtask_06.txt, subtask_07.txt, subtask_08.txt, subtask_09.txt, subtask_10.txt, subtask_11.txt, subtask_12.txt, subtask_13.txt, subtask_14.txt, subtask_15.txt, subtask_16.txt
All scrambled_00.txt, scrambled_01.txt, scrambled_02.txt, scrambled_03.txt, scrambled_04.txt, scrambled_05.txt, scrambled_06.txt, scrambled_07.txt, scrambled_08.txt, scrambled_09.txt, scrambled_10.txt, scrambled_11.txt, scrambled_12.txt, scrambled_13.txt, scrambled_14.txt, scrambled_15.txt, scrambled_16.txt, scrambled_17.txt, scrambled_18.txt, scrambled_19.txt, scrambled_20.txt, scrambled_21.txt, scrambled_22.txt, scrambled_23.txt, scrambled_24.txt, scrambled_25.txt, scrambled_26.txt, scrambled_27.txt, scrambled_28.txt, scrambled_29.txt, scrambled_30.txt, scrambled_31.txt, scrambled_32.txt, subtask_00.txt, subtask_01.txt, subtask_02.txt, subtask_03.txt, subtask_04.txt, subtask_05.txt, subtask_06.txt, subtask_07.txt, subtask_08.txt, subtask_09.txt, subtask_10.txt, subtask_11.txt, subtask_12.txt, subtask_13.txt, subtask_14.txt, subtask_15.txt, subtask_16.txt
Case Name Status Exec Time Memory
scrambled_00.txt AC 50 ms 860 KB
scrambled_01.txt AC 30 ms 1272 KB
scrambled_02.txt AC 31 ms 1268 KB
scrambled_03.txt AC 32 ms 1268 KB
scrambled_04.txt AC 31 ms 1272 KB
scrambled_05.txt AC 32 ms 1312 KB
scrambled_06.txt AC 30 ms 1312 KB
scrambled_07.txt AC 32 ms 1312 KB
scrambled_08.txt AC 31 ms 1268 KB
scrambled_09.txt AC 31 ms 1268 KB
scrambled_10.txt AC 31 ms 1380 KB
scrambled_11.txt AC 1335 ms 32996 KB
scrambled_12.txt AC 1324 ms 32920 KB
scrambled_13.txt AC 1319 ms 32996 KB
scrambled_14.txt AC 1337 ms 33044 KB
scrambled_15.txt AC 1354 ms 32996 KB
scrambled_16.txt AC 1362 ms 32972 KB
scrambled_17.txt AC 1345 ms 33000 KB
scrambled_18.txt AC 1339 ms 32992 KB
scrambled_19.txt AC 1330 ms 33048 KB
scrambled_20.txt AC 1353 ms 32880 KB
scrambled_21.txt AC 576 ms 33004 KB
scrambled_22.txt AC 32 ms 1272 KB
scrambled_23.txt AC 34 ms 1312 KB
scrambled_24.txt AC 33 ms 1240 KB
scrambled_25.txt AC 34 ms 1312 KB
scrambled_26.txt AC 32 ms 1240 KB
scrambled_27.txt AC 1216 ms 32996 KB
scrambled_28.txt AC 1161 ms 32976 KB
scrambled_29.txt AC 1183 ms 32908 KB
scrambled_30.txt AC 1160 ms 33000 KB
scrambled_31.txt AC 1175 ms 32996 KB
scrambled_32.txt AC 25 ms 928 KB
subtask_00.txt AC 26 ms 928 KB
subtask_01.txt AC 33 ms 1268 KB
subtask_02.txt AC 33 ms 1308 KB
subtask_03.txt AC 32 ms 1272 KB
subtask_04.txt AC 30 ms 1312 KB
subtask_05.txt AC 32 ms 1264 KB
subtask_06.txt AC 32 ms 1268 KB
subtask_07.txt AC 32 ms 1312 KB
subtask_08.txt AC 31 ms 1264 KB
subtask_09.txt AC 31 ms 1272 KB
subtask_10.txt AC 31 ms 1316 KB
subtask_11.txt AC 33 ms 1316 KB
subtask_12.txt AC 31 ms 1308 KB
subtask_13.txt AC 32 ms 1376 KB
subtask_14.txt AC 32 ms 1268 KB
subtask_15.txt AC 32 ms 1304 KB
subtask_16.txt AC 26 ms 928 KB