제출 #1343070

#제출 시각아이디문제언어결과실행 시간메모리
1343070dwuyDynamic Diameter (CEOI19_diameter)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;
typedef pair<int, int> pii;

struct BIT{
    int n;
    vector<int> tree;

    BIT(int n = 0){
        this->n = n + 1;
        this->tree.assign(n + 5, 0);
    }

    void update(int idx, int val){
        for(; idx<=n; idx+=-idx&idx) tree[idx] += val;
    }

    void update(int l, int r, int val){
        update(l, val);
        update(r + 1, -val);
    }

    int get(int idx){
        int res = 0;
        for(; idx; idx-=-idx&idx) res += tree[idx];
        return res;
    }
};

struct SMT{
    int n;
    vector<int> tree;

    SMT(int n = 0){
        this->n = n;
        this->tree.assign(n<<2|3, 0);
    }

    void update(int pos, int val){
        int id = 1;
        for(int lo=1, hi=n; lo<hi;){
            int mid = (lo + hi)>>1;
            if(pos <= mid) hi = mid, id = id<<1;
            else lo = mid + 1, id = id<<1|1;
        }
        tree[id] = val;
        for(id>>=1; id; id>>=1) tree[id] = max(tree[id<<1], tree[id<<1|1]);
    }

    int get(int pos){
        int res = 0;
        for(int lo=1, hi=n, id=1; lo<hi;){
            int mid = (lo + hi)>>1;
            if(pos <= mid) hi = mid, id = id<<1;
            else{
                res = max(res, tree[id<<1]);
                lo = mid + 1;
                id = id<<1|1;
            }
        }
        return res;
    }

    int rget(int pos){
        int res = 0;
        for(int lo=1, hi=n, id=1; lo<hi;){
            int mid = (lo + hi)>>1;
            if(pos > mid) lo = mid + 1, id = id<<1|1;
            else{
                res = max(res, tree[id<<1|1]);
                hi = mid;
                id = id<<1;
            }
        }
        return res;
    }

    int get(int l, int r){
        return max(get(l), rget(r));
    }
};

const int MX = 100005;
int n, q, W;
int e[MX];
int c[MX];
pii edges[MX];
vector<int> G[MX];

void nhap(){
    cin >> n >> q >> W;
    for(int i=1; i<n; i++){
        int u, v;
        cin >> u >> v >> c[i];
        e[i] = u ^ v;
        edges[i] = {u, v};
        G[u].push_back(i);
        G[v].push_back(i);
    }
}

namespace HLD{
    int p[MX];
    int h[MX];
    int numC[MX];
    int heavy[MX];
    BIT bit(MX);

    int dfsID = 0;
    int num[MX];
    int clo[MX];
    int head[MX];

    void dfs(int u){
        h[u] = h[p[u]] + 1;
        numC[u] = 1;
        for(int i: G[u]){
            int v = e[i] ^ v;
            if(v != p[u]){
                h[v] = u;
                dfs(v);
                numC[u] += numC[v];
                if(numC[heavy[u]] < numC[v]) heavy[u] = v;
            }
        }
    }

    void decompose(int u, int he){
        num[u] = ++dfsID;
        head[u] = he;
        if(heavy[u]) decompose(heavy[u], he);
        for(int i: G[u]){
            int v = e[i] ^ u;
            if(v != p[u] && v != heavy[u]) decompose(v, v);
        }
        clo[u] = dfsID;
    }

    int LCA(int u, int v){
        while(head[u] != head[v]){
            if(h[head[u]] < h[head[v]]) swap(u, v);
            u = p[head[u]];
        }
        return h[u] < h[v]? u : v;
    }

    void build(){
        dfs(1);
        decompose(1, 1);
        for(int i=1; i<n; i++){
            int u, v;
            tie(u, v) = edges[i];
            if(h[u] > h[v]) swap(u, v);
            bit.update(num[v], clo[v], c[i]);
        }
    }

    void update(int i, int x){
        int u, v;
        tie(u, v) = edges[i];
        if(h[u] > h[v]) swap(u, v);
        bit.update(num[v], clo[v], x - c[i]);
        c[i] = x;
    }

    int get(int u, int v){
        int puv = LCA(u, v);
        return bit.get(u) + bit.get(v) - 2*bit.get(puv);
    }
}

namespace CENTROID{
    int h[MX];
    int num[]
    int pp[MX];
    int head[MX];
    int numC[MX];
    SMT smt[MX];
    vector<int> T[MX];
    multiset<int> mxdi[MX];
    multiset<int> lowd[MX];
    bitset<MX> used = 0;
    
    void calChild(int u, int p){
        h[u] = h[p] + 1;
        numC[u] = 0;
        for(int i: G[u]){
            int v = e[i] ^ u;
            if(v != p && !used[v]) calChild(v, u);
            numC[u] += numC[v];
        }
    }

    int Centroid(int u, int p, const int &half){
        for(int i: G[u]){
            int v = u ^ e[i];
            if(v != p && !used[v] && numC[v] > half) return Centroid(v, u, half);
        }
        return u;
    }

    void decompose(int u, int p){
        calChild(u, 0);
        int sz = numC[u];
        u = Centroid(u, 0, numC[u] >> 1);
        head[u] = p;
        h[u] = h[head[u]] + 1;
        smt[u] = SMT(sz);

        used[u] = 1;
        for(int i: G[u]){
            int v = e[u] ^ u;
            if(!used[v]) decompose(v, u);
        }     
        
        
    }

    void build(){
        decompose(1, 0);
    }
}

void solve(){
    HLD::build();
    CENTROID::build();

    int last = 0;
    while(q--){
        int d, e;
        cin >> d >> e;
        d = (d + last) % (n - 1) + 1;
        e = (e + W) % last;
        
        
        cout << last << endl;
    }
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); 

    nhap();
    solve();

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

diameter.cpp:2:13: error: expected initializer before 'long'
    2 | #define int long long
      |             ^~~~
diameter.cpp:177:5: note: in expansion of macro 'int'
  177 |     int pp[MX];
      |     ^~~