이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define NMAX 200001
#define pb push_back
#define eb emplace_back
#define MOD 100003
#define nl '\n'
#define INF  2147483647
#define LLONG_MAX 9223372036854775807
#define pii pair<int,int>
#define tpl tuple<int,int,int>
//#pragma GCC optimize("O3")
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
/*
 *
 *
    ================DEMONSTRATION===================
 
 
    =====================END========================
 */
struct item{
    map<int,int>regions;
};
class segtree{
private:
    int n;
    vector<item>tree;
public:
    void init(int sz)
    {
        n=sz;
        tree.resize(4*sz+1);
    }
    item neutru;
    item combine(item a,item b)
    {
        item ans;
        for(auto [x,y]:a.regions)
            ans.regions[x]+=y;
        for(auto [x,y]:b.regions)
            ans.regions[x]+=y;
        return ans;
    }
    void update(int node,int st,int dr,int pos,int region)
    {
        if(st==dr)
        {
 
            tree[node].regions[region]++;
            return;
        }
        int mid=(st+dr)/2;
        if(pos<=mid)
            update(2*node,st,mid,pos,region);
        else
            update(2*node+1,mid+1,dr,pos,region);
 
        tree[node]=combine(tree[2*node],tree[2*node+1]);
    }
 
    item query(int node,int st,int dr,int L,int R)
    {
        if(st>R || dr<L)
        {
            return neutru;
        }
        if(L<=st && dr<=R)
        {
            return tree[node];
        }
        int mid=(st+dr)/2;
        item left=query(2*node,st,mid,L,R);
        item right=query(2*node+1,mid+1,dr,L,R);
        return combine(left,right);
    }
 
    void update(int pos,int region)
    {
        update(1,1,n,pos,region);
    }
    int query(int L,int R,int region)
    {
        int ans=query(1,1,n,L,R).regions[region];
        return ans;
    }
    void check()
    {
        for(auto [x,y]:tree[1].regions)
        {
            cout<<x<<" "<<y<<nl;
        }
    }
};
int n,r,q;
int r1,r2,ans;
vector<int>h(NMAX),s(NMAX);
vector<int>tin(NMAX),tout(NMAX);
vector<vector<int>>G(NMAX);
vector<vector<int>>R(25001);
int timp;
void read_query()
{
    cin>>r1>>r2;
}
void print_query()
{
    cout.flush()<<ans<<nl;
    cout.flush();
}
void dfs(int node,int parent)
{
    tin[node]=++timp;
    for(auto x:G[node])
    {
        if(x!=parent)
            dfs(x,node);
    }
    tout[node]=timp;
}
segtree seg;
signed main() {
 
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    cin>>n>>r>>q;
    cin>>h[1];
    R[h[1]].pb(1);
    for(int i=2;i<=n;++i)
    {
        cin>>s[i]>>h[i];
        R[h[i]].pb(i);
        G[i].pb(s[i]);
        G[s[i]].pb(i);
    }
 
    dfs(1,-1);
 
    seg.init(n);
    for(int i=1;i<=n;++i)
    {
        seg.update(tin[i],h[i]);
    }
//    seg.check();
    while(q--)
    {
        ans=0;
        read_query();
        for(auto x:R[r1])
        {
            int aux=seg.query(tin[x],tout[x],r2);
            ans+=(aux);
        }
        print_query();
    }
 
    return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
regions.cpp:8: warning: "LLONG_MAX" redefined
    8 | #define LLONG_MAX 9223372036854775807
      | 
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/limits.h:195,
                 from /usr/lib/gcc/x86_64-linux-gnu/10/include/syslimits.h:7,
                 from /usr/lib/gcc/x86_64-linux-gnu/10/include/limits.h:34,
                 from /usr/include/c++/10/climits:42,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:39,
                 from regions.cpp:1:
/usr/include/limits.h:135: note: this is the location of the previous definition
  135 | #  define LLONG_MAX __LONG_LONG_MAX__
      || # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |