Skip to content

Instantly share code, notes, and snippets.

@lauzi
Created April 19, 2014 08:24
Show Gist options
  • Save lauzi/11077834 to your computer and use it in GitHub Desktop.
Save lauzi/11077834 to your computer and use it in GitHub Desktop.
#include <cstdio>
#include <vector>
using namespace std;
typedef long long LL;
const int MAXV = 100001;
const LL MOD = 1000000007;
const LL MAGIC = 12347;
int ps[MAXV];
vector<int> cld[MAXV];
int lvl[MAXV];
vector<int> vs;
void dfs_d(int u, int d) {
lvl[u] = d;
for (int i = 0; i < cld[u].size(); ++i)
dfs_d(cld[u][i], d+1);
}
void dfs_v(int p, int l, int r, int delta) {
if (lvl[p] > r) return ;
if (l <= lvl[p]) vs[p] = (vs[p] + delta) % MOD;
for (int i = 0; i < cld[p].size(); ++i)
dfs_v(cld[p][i], l, r, delta);
}
int jizz() {
int v;
scanf("%d", &v);
for (int i = 1; i <= v; ++i) cld[i].resize(0);
for (int i = 2; i <= v; ++i) {
scanf("%d", &ps[i]);
cld[ps[i]].push_back(i);
}
dfs_d(1, 1);
vs = vector<int>(v + 1);
int q; scanf("%d", &q);
while (q--) {
int u, l, r, delta;
scanf("%d%d%d%d", &u, &l, &r, &delta);
dfs_v(u, l, r, delta);
}
LL hash = 0;
for (int i = 1; i <= v; ++i)
hash = (hash * MAGIC + vs[i]) % MOD;
return (int) hash;
}
int main() {
int T;
scanf("%d", &T);
for (int t = 1; t <= T; ++t) {
printf("Case %d: %d\n", t, jizz());
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment