/*
考虑对于询问分块, 每根号n个询问做一次
考虑一次询问, 我们建立出虚树来每条链上的更改一定是一样的, 然后会有根号条链 对于每条链上的点按照w基数排序并且合并相同, 然后每次更改 就是一个指针移动一格, 根号n次更改每次都要枚举一遍所有的链 所以是On的 总体N\sqrt(N) 比着 DOFYPXY 的代码打的
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#define ll long long
#define M 100010
#define mmp make_pair
using namespace std;
int read() {
int nm = 0;
char c = getchar();
for(; !isdigit(c); c = getchar());
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm;
}
int n, m, tote, dft, ans, t[M], q[M], r[M], deep[M], top[M], son[M], sz[M], u[M], st[M], id[M], key[M], dfn[M], fa[M];
const int biao = 600;
vector<int> to[M], buc[M << 1];
bool b[M]; void dfs(int now, int f) {
deep[now] = deep[f] + 1;
sz[now] = 1;
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
dfs(vj, now);
if(sz[son[now]] < sz[vj]) son[now] = vj;
sz[now] += sz[vj];
}
} void dfs(int now) {
dfn[now] = ++dft;
if(son[now]) {
top[son[now]] = top[now];
dfs(son[now]);
}
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
if(vj == son[now]) continue;
top[vj] = vj;
dfs(vj);
}
} int lca(int a, int b) {
while(top[a] != top[b]) {
if(deep[top[a]] < deep[top[b]]) swap(a, b);
a = fa[top[a]];
}
if(deep[a] > deep[b]) swap(a, b);
return a;
} bool cmp(int a, int b) {
return dfn[a] < dfn[b];
} int rec(int now) {
int a = b[now];
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
a += rec(vj);
}
r[now] = t[now] - a;
return a;
}
#define pii pair<int, int>
struct Note {
int hd, pnt, sum, dx;
vector<pii> s;
void clear() {
hd = pnt = sum = dx = 0;
vector<pii>().swap(s);
}
} g[M]; void work(int L, int R) {
rec(1);
for(int i = L; i <= R; i++) u[i - L] = q[i];
sort(u, u + R - L + 1, cmp);
int tp = 1, num = 1;
st[1] = key[1] = 1;
for(int i = 0; i <= R - L; i++) {
int A = lca(u[i], st[tp]);
while(deep[A] < deep[st[tp]]) {
if(deep[st[tp - 1]] <= deep[A]) {
g[st[tp--]].hd = A;
if(st[tp] != A) st[++tp] = A, key[++num] = A;
break;
}
g[st[tp]].hd = st[tp - 1];
tp--;
}
if(st[tp] != u[i]) st[++tp] = u[i], key[++num] = u[i];
}
for(; tp > 1; tp--) g[st[tp]].hd = st[tp - 1];
memset(id, 0, sizeof(id)); for(int i = 1; i <= num; i++) {
for(int p = fa[key[i]]; p != g[key[i]].hd; p = fa[p]) {
id[p] = key[i];
}
}
for(int i = 0; i <= (n << 1); i++) vector<int>().swap(buc[i]); for(int i = 1; i <= n; i++) if(!b[i]) buc[r[i] + n].push_back(i);
for(int i = 0; i <= (n << 1); i++) {
for(int j = 0; j < buc[i].size(); j++) {
if(id[buc[i][j]]) {
int o = id[buc[i][j]], ss = g[o].s.size();
if(ss && g[o].s[ss - 1].first == i - n) g[o].s[ss - 1].second++;
else g[o].s.push_back(mmp(i - n, 1));
}
}
}
for(int i = 1; i <= num; i++)
for(int k = key[i]; g[k].pnt < g[k].s.size() && g[k].s[g[k].pnt].first < 0; g[k].pnt++);
for(int i = L; i <= R; i++) {
b[q[i]] ^= 1;
if(b[q[i]]) {
if(r[q[i]] < 0) ans--;
r[q[i]]--;
for(int p = q[i]; g[p].hd;) {
g[p].dx--;
if(g[p].pnt < g[p].s.size() && g[p].s[g[p].pnt].first + g[p].dx < 0) ans += g[p].s[g[p].pnt].second, g[p].pnt++;
p = g[p].hd, r[p]--;
if(b[p] == 0 && r[p] == -1) ans++;
}
} else {
r[q[i]]++;
if(r[q[i]] < 0) ans++;
for(int p = q[i]; g[p].hd;) {
g[p].dx++;
if(g[p].pnt && g[p].s[g[p].pnt - 1].first + g[p].dx >= 0) g[p].pnt--, ans -= g[p].s[g[p].pnt].second;
p = g[p].hd, r[p]++;
if(b[p] == 0 && r[p] == 0) ans--;
}
}
cout << ans << ' ';
}
for(int i = 1; i <= num; i++) g[key[i]].clear();
} int main() {
n = read(), m = read();
for(int i = 2; i <= n; i++) fa[i] = read(), to[fa[i]].push_back(i);
dfs(1, 0);
top[1] = 1;
dfs(1);
for(int i = 1; i <= n; i++) t[i] = read();
for(int i = 1; i <= m; i++) q[i] = read();
for(int i = 1; i <= m; i += biao) work(i, min(i + biao - 1, m));
return 0;
}

CF 966E May Holidays的更多相关文章

  1. CF Gym 100187D Holidays (数学,递推)

    题意:给n个元素,从n中选两个非空集合A和B.问有多少中选法? 递推: dp[n]表示元素个数为n的方案数,对于新来的一个元素,要么加入集合,要么不加入集合自成一个集合.加入集合有三种选择,A,B,E ...

  2. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  3. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  4. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  5. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  6. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  7. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  8. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  9. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

随机推荐

  1. CSS vertical-algin的使用

    一.什么vertical-algin vertical的意思就是垂直,algin是对齐的意思,连起来就是“垂直对齐方式”,接下来看看vertical-algin有哪些属性,打开浏览器一看 vertic ...

  2. webpack 4 升级点

    webpack 4 升级点: 默认entry为./src,默认output为/dist sideEffects 在webapck2开始支持ESModule后,webpack提出了tree-shakin ...

  3. gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性

    首先,这些C函数,在VS上要加_s后缀的原因是,这些函数存在字符串越界等问题,可以参考这篇文章,https://blog.csdn.net/silleyj/article/details/854540 ...

  4. Scala实战

    1. Eclipse中设置scala调试器 scala的调试器要选择Scala Application(new debuger)Launcher:开始选择图省事,选择了一个字母少的,亲切的Launch ...

  5. 蒲公英 Bug 管理云

    官网访问地址:https://www.tracup.com/ 优势地方: ①免费使用 现在免费,今后也一直免费. ②无需部署 网站采用云端部署,这也就意味着无需开发者自己搭建.部署,注册一个蒲公英账号 ...

  6. ManualResetEvent学习实例

    ManualResetEvent为多个线程之间提供了一个共享的信号. 初始化:ManualResetEvent mre=new ManualResetEvent(true) 初始值为true表示有信号 ...

  7. 我的Netty笔记

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  8. 峰Redis学习(4)Redis 数据结构(List的操作)

    第四节:Redis 数据结构之List 类型 存储list: ArrayList使用数组方式 LinkedList使用双向链接方式   双向链接表中增加数据 双向链接表中删除数据   存储list常用 ...

  9. 数据库SQL语言学习--上机练习3(插入 更新 删除)

    上机练习3 . 将一个新学生记录(学号::姓名:陈冬:性别:男:所在系:信息系:年龄:20岁)插入到Student表中: ALTER TABLE Student ,); UPDATE Student ...

  10. 计时器setInterval()

    在执行时,从载入页面后每隔指定的时间执行代码. 语法: setInterval(代码,交互时间); 参数说明: 1. 代码:要调用的函数或要执行的代码串. 2. 交互时间:周期性执行或调用表达式之间的 ...