This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 2e5 + 5, B = 500, Rmax = 25005;
typedef long long ll;
int n, R, Q, tmp;
int reg[Nmax], t[Nmax], cnt[Rmax];
int up[Nmax], down[Nmax], code[Nmax];
ll val1[Nmax / B + 5][Rmax], val2[Nmax / B + 5][Rmax];
vector<int> v[Nmax], In[Nmax], Out[Nmax];
void dfs(int node = 1)
{
// In[node] = ++tmp;
In[reg[node]].push_back(++tmp);
for(auto it : v[node]) dfs(it);
// Out[node] = tmp;
Out[reg[node]].push_back(tmp);
}
void calc1(int R)
{
int i;
for(i=1; i<=n; ++i)
{
up[i] = up[t[i]] + (reg[i] == R);
val1[code[R]][reg[i]] += up[i];
}
}
void calc2(int R)
{
int i;
for(i=n; i; --i)
{
down[i] = (reg[i] == R);
for(auto it : v[i]) down[i] += down[it];
val2[code[R]][reg[i]] += down[i];
}
}
void precalc()
{
dfs();
int i, Nrcodes = 0;
for(i=1; i<=n; ++i) ++cnt[reg[i]];
for(i=1; i<=R; ++i)
if(cnt[i] > B)
{
code[i] = ++Nrcodes;
calc1(i);
calc2(i);
}
}
int query(int x, int y)
{
if(cnt[x] > B) return val1[code[x]][y];
if(cnt[y] > B) return val2[code[y]][x];
int i = 0, ans = 0;
for(auto it : In[x])
{
while(i < In[y].size() && In[y][i] <= it) ++i;
ans -= i;
}
i = 0;
for(auto it : Out[x])
{
while(i < In[y].size() && In[y][i] <= it) ++i;
ans += i;
}
return ans;
}
int main()
{
// freopen("input", "r", stdin);
cin.sync_with_stdio(false);
cin >> n >> R >> Q >> reg[1];
int i, x, y;
for(i=2; i<=n; ++i)
{
cin >> t[i] >> reg[i];
v[t[i]].push_back(i);
}
precalc();
while(Q--)
{
cin >> x >> y;
cout << query(x, y) << endl;
}
return 0;
}
Compilation message (stderr)
regions.cpp: In function 'int query(int, int)':
regions.cpp:72:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(i < In[y].size() && In[y][i] <= it) ++i;
~~^~~~~~~~~~~~~~
regions.cpp:79:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(i < In[y].size() && In[y][i] <= it) ++i;
~~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |