您的位置:首页 > 其它

3720: Gty的妹子树

2016-04-30 09:53 253 查看
树分块..

#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=(n);i++)
using namespace std;
const int N=60105;
int n,lastans=0,Size,w
,m,belong
,cnt=0,fa
,ans;
struct E{
int to,next;
E(int to=0,int next=0):to(to),next(next){}
}edge[2][N<<1];
int head[2]
,tot[2];
void add(int x,int y,int op){
edge[op][++tot[op]]=E(y,head[op][x]);head[op][x]=tot[op];

if(!op){edge[op][++tot[op]]=E(x,head[op][y]);head[op][y]=tot[op];}
}
struct block{
int size;int G[211];
block(){size=0;}
int query(int y){
return size-(upper_bound(G+1,G+1+size,y)-G)+1;
}
void insert(int x){size++;
for(int i=size;i>=1;i--){    //
if(G[i-1]>x)G[i]=G[i-1];
else {G[i]=x;break;}
}
}

void modify(int x,int y){
int pos=lower_bound(G+1,G+1+size,x)-G;
G[pos]=y;
for(int i=pos+1;i<=size;i++)if(G[i-1]>G[i])swap(G[i-1],G[i]);else break;
for(int i=pos;i>=1;i--)if(G[i-1]>G[i])swap(G[i-1],G[i]);else break;
}
}b[30100];
void dfs(int x){
if(b[belong[fa[x]]].size>=Size){
belong[x]=++cnt;
b[cnt].insert(w[x]);
add(belong[fa[x]],cnt,1);
}
else{int v=belong[fa[x]];
belong[x]=v;
b[v].insert(w[x]);
}
for(int i=head[0][x];i;i=edge[0][i].next){
int v=edge[0][i].to;
if(v!=fa[x]){
fa[v]=x;dfs(v);
}
}
}
void Dfs(int x,int y){
ans+=b[x].query(y);
for(int i=head[1][x];i;i=edge[1][i].next){
int v=edge[1][i].to;
Dfs(v,y);
}
}
void solve(int x,int y){
if(w[x]>y)ans++;
for(int i=head[0][x];i;i=edge[0][i].next){
int v=edge[0][i].to;
if(v!=fa[x]){
if(belong[v]==belong[x])solve(v,y);
else Dfs(belong[v],y);
}
}
}
int main(){
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
scanf("%d",&n);
Size=sqrt(n)+1;
int x,y,op;
rep(i,1,n-1){
scanf("%d%d",&x,&y);add(x,y,0);
}rep(i,1,n)scanf("%d",&w[i]);
dfs(1);
cin>>m;
rep(i,1,m){
scanf("%d%d%d",&op,&x,&y);x^=lastans;y^=lastans;
switch(op){
case 0:
ans=0;solve(x,y);
lastans=ans;
printf("%d\n",ans);
break;
case 1:
b[belong[x]].modify(w[x],y);w[x]=y;
break;
case 2:
w[++n]=y;fa
=x;
add(x,n,0);
dfs(n);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: