이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
// macros
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll, ll> lll;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<lll> vlll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define FOR(a,b) for(auto& a : b)
#define all(a) a.begin(), a.end()
#define INF 1e9
#define EPS 1e-9
#define pb push_back
#define popb pop_back
#define fi first
#define se second
#define sz size()
// input
template<class T> void IN(T& x) {cin >> x;}
template<class H, class... T> void IN(H& h, T&... t) {IN(h); IN(t...); }
// output
template<class T1, class T2> void OUT(const pair<T1,T2>& x);
template<class T> void OUT(const T& x) {cout << x;}
template<class H, class... T> void OUT(const H& h, const T&... t) {OUT(h); OUT(t...); }
template<class T1, class T2> void OUT(const pair<T1,T2>& x) {OUT(x.fi," ",x.se);}
template<class... T> void OUTL(const T&... t) {OUT(t..., "\n"); }
//===================//
//  Added libraries  //
//===================//
//===================//
//end added libraries//
//===================//
void program();
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    program();
}
//===================//
//   begin program   //
//===================//
const int MX = 2e5;
int n, q;
ll w, last=0;
map<int,int> edgeN[MX];
set<int> adj[MX];
int a[MX], b[MX]; ll c[MX];
int SZ[MX];
vll SEG[MX], LAZY[MX];
int cdN[MX];
viii infl[MX];
int bg[MX], ed[MX], curbg, curSeg;
vii segAreas[MX];
map<ll,int> SEGCNT[MX];
vll SEGT, LAZYT;
void apply(vll& S, vll& L, int p, ll v) {
    S[p] += v;
    if(p<L.sz) L[p] += v;
}
void build(vll& S, vll& L, int p) {
    while(p>1) p>>=1, S[p]=max(S[p<<1],S[p<<1|1])+L[p];
}
void push(vll& S, vll& L, int p) {
    int h = sizeof(int)*8 - __builtin_clz((int)L.sz);
    REV(s,1,h+1) {
        int i = p>>s;
        if(L[i]!=0) {
            apply(S,L,i<<1,L[i]);
            apply(S,L,i<<1|1,L[i]);
            L[i]=0;
        }
    }
}
void addSeg(vll& S, vll& L, int l, int r, ll v) {
    l+=L.sz, r+=L.sz+1;
    int l0=l, r0=r;
    for(; l<r; l>>=1, r>>=1) {
        if(l&1) apply(S,L,l++,v);
        if(r&1) apply(S,L,--r,v);
    }
    build(S,L,l0);
    build(S,L,r0-1);
}
ll getSeg(vll& S, vll& L, int l, int r) {
    l+=L.sz, r+=L.sz+1;
    push(S,L,l);
    push(S,L,r-1);
    ll res=-1e18;
    for(; l<r; l>>=1, r>>=1) {
        if(l&1) res = max(res, S[l++]);
        if(r&1) res = max(res, S[--r]);
    }
    return res;
}
void setSeg(vll& S, vll& L, int p, ll v) {
    addSeg(S,L,p,p,-getSeg(S,L,p,p));
    addSeg(S,L,p,p,v);
}
void dfsSZ(int u, int p=-1) {
    SZ[u] = 1;
    FOR(v,adj[u]) if(v!=p) dfsSZ(v,u), SZ[u]+=SZ[v];
}
int dfsCent(int u, int p, int tot) {
    FOR(v,adj[u]) if(v!=p && SZ[v] >= tot/2) return dfsCent(v,u,tot);
    return u;
}
int findCentroid(int u) {
    dfsSZ(u);
    return dfsCent(u,-1,SZ[u]);
}
void dfsBG(int u, int p=-1) {
    bg[u] = curbg++;
    FOR(v,adj[u]) if(v!=p) {
        dfsBG(v,u);
        int e = edgeN[u][v];
        infl[e].pb({curSeg,bg[v],ed[v]});
        addSeg(SEG[curSeg], LAZY[curSeg], bg[v], ed[v], c[e]);
        if(u == curSeg) {
            segAreas[u].pb({bg[v],ed[v]});
        }
    }
    ed[u] = curbg-1;
}
void updateSeg(int u) {
    ll res=0, used=0;
    auto it = SEGCNT[u].end();
    while(used<2) {
        if(it == SEGCNT[u].begin()) break;
        it--;
        if(used == 1 || it->se == 1) {
            res += it->fi;
        } else {
            res += it->fi*2ll;
        }
        used += it->se;
    }
    setSeg(SEGT,LAZYT,u,res);
}
void createSeg(int u) {
    dfsSZ(u);
    cdN[u] = SZ[u];
    SEG [u].assign(cdN[u]*2, 0);
    LAZY[u].assign(cdN[u], 0);
    curbg=0;
    curSeg=u;
    dfsBG(u);
    FOR(p,segAreas[u]) SEGCNT[u][getSeg(SEG[u],LAZY[u],p.fi,p.se)]++;
    updateSeg(u);
}
void centDe(int u) {
    int cent = findCentroid(u);
    createSeg(cent);
    for(int v:adj[cent]) {
        adj[v].erase(cent);
        centDe(v);
    }
    adj[cent].clear();
}
void program() {
    IN(n,q,w);
    RE1(i,n-1) {
        IN(a[i],b[i],c[i]);
        adj[a[i]].insert(b[i]);
        adj[b[i]].insert(a[i]);
        edgeN[a[i]][b[i]] = i;
        edgeN[b[i]][a[i]] = i;
    }
    SEGT.resize((n+1)*2);
    LAZYT.resize(n+1);
    centDe(1);
    RE(queryNumber,q) {
        ll d, e; IN(d,e);
        d = (d+last)%(n-1); d++;
        e = (e+last)%w;
        FOR(p,infl[d]) {
            int bgs, eds;
            tie(curSeg, bgs, eds) = p;
            ii p2 = *(--lower_bound(all(segAreas[curSeg]), ii{bgs,INF}));
            ll gsres = getSeg(SEG[curSeg],LAZY[curSeg],p2.fi,p2.se);
            if(--SEGCNT[curSeg][gsres] == 0) SEGCNT[curSeg].erase(gsres);
            addSeg(SEG[curSeg], LAZY[curSeg], bgs, eds, -c[d]);
            addSeg(SEG[curSeg], LAZY[curSeg], bgs, eds, e);
            SEGCNT[curSeg][getSeg(SEG[curSeg],LAZY[curSeg],p2.fi,p2.se)]++;
            updateSeg(curSeg);
        }
        c[d] = e;
        last = getSeg(SEGT,LAZYT,0,n);
        OUTL(last);
    }
}
컴파일 시 표준 에러 (stderr) 메시지
diameter.cpp: In function 'void apply(vll&, vll&, int, ll)':
diameter.cpp:80:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(p<L.sz) L[p] += v;
         ^| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |