#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
int n, m;
void read(int &x) {
char ch = getchar(); int f = 1; x = 0;
while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
while(ch >='0' && ch <='9') { x = x * 10 + ch - 48; ch = getchar(); }
x *= f;
}
struct LinkCutTree {
bool rt[maxn];
int c[maxn][2], fa[maxn], size[maxn];
void init() {
memset(c, 0, sizeof(c));
memset(fa, 0, sizeof(fa));
memset(rt, true, sizeof(rt));
}
void maintain(int u) { size[u] = size[c[u][0]] + size[c[u][1]] + 1; }
void rotate(int u) {
int v = fa[u], w = fa[v], t = c[v][1] == u;
c[v][t] = c[u][!t], fa[c[u][!t]] = v;
fa[u] = fa[v], fa[v] = u, c[u][!t] = v;
if(!rt[v]) c[w][c[w][1] == v] = u;
else rt[u] = 1, rt[v] = 0;
maintain(v);
}
void Splay(int u) {
while(!rt[u]) {
int v = fa[u], w = fa[v];
if(rt[v])
rotate(u);
else if((c[v][0] == u) == (c[w][0] == v))
rotate(v), rotate(u);
else rotate(u), rotate(u);
}
maintain(u);
}
void access(int u) {
int v = 0;
while(u) {
//cout<<u<<' '<<fa[u]<<endl;
Splay(u);
rt[c[u][1]] = 1, rt[v] = 0;
c[u][1] = v;
maintain(u);
v = u;
u = fa[u];
}
}
void cut(int u) {
access(u);
Splay(u);
rt[c[u][0]] = 1;
c[u][0] = fa[c[u][0]] = 0;
}
void link(int u, int v) {
cut(u);
fa[u] = v;
maintain(u);
}
}LCT;
int x, y, z;
int main() {
read(n);
LCT.init();
for(int i=1; i<=n; i++) {
read(x);
LCT.size[i] = 1;
LCT.fa[i] = i + x > n ? 0 : i + x;
}
read(m);
while(m--) {
read(x), read(y); y++;
if(x == 1) {
LCT.access(y);
LCT.Splay(y);
printf("%d\n", LCT.size[LCT.c[y][0]] + 1);
}else {
read(z);
LCT.link(y, y+z > n ? 0 : y+z);
}
}
return 0;
}
Hnoi2010 bounce Link-Cut Tree
最新推荐文章于 2022-01-28 06:23:14 发布