思路:

恶心的数据结构题……

首先 我们 链剖 把树 变成序列 再 套一个 区间 第K大就好了……

复杂度(n*log^4n)

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 88888
#define inf 100000000
int n,q,first[N],next[N*2],v[N*2],t[N],tot,op,xx,yy;
int fa[N],son[N],deep[N],top[N],siz[N],cnt,ch[N];
int root[N*40],size;
struct Treap{int ch[2],sz,cnt,v,rnd;}tr[N*40];
void Upd(int k){tr[k].sz=tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz+tr[k].cnt;}
void Rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}
void Insert(int &k,int num){
if(!k){k=++size;tr[k].sz=tr[k].cnt=1,tr[k].rnd=rand();tr[k].v=num;return;}
tr[k].sz++;
if(tr[k].v==num){tr[k].cnt++;return;}
bool f=num>tr[k].v;
Insert(tr[k].ch[f],num);
if(tr[tr[k].ch[f]].rnd<tr[k].rnd)Rot(k,f);
}
void Del(int &k,int num){
if(tr[k].v==num){
if(tr[k].cnt>1)tr[k].cnt--,tr[k].sz--;
else if(tr[k].ch[0]*tr[k].ch[1]==0)k=max(tr[k].ch[0],tr[k].ch[1]);
else Rot(k,tr[tr[k].ch[0]].rnd>tr[tr[k].ch[1]].rnd),Del(k,num);
}
else tr[k].sz--,Del(tr[k].ch[num>tr[k].v],num);
}
int get_rank(int k,int num){
if(!k)return 0;
if(tr[k].v==num)return tr[tr[k].ch[1]].sz;
else if(tr[k].v<num)return get_rank(tr[k].ch[1],num);
else return get_rank(tr[k].ch[0],num)+tr[tr[k].ch[1]].sz+tr[k].cnt;
}
void insert(int l,int r,int pos,int num,int wei){
Insert(root[pos],wei);
if(l==r)return;
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<num)insert(mid+1,r,rson,num,wei);
else insert(l,mid,lson,num,wei);
}
void change(int l,int r,int pos,int num,int wei){
Del(root[pos],t[xx]),Insert(root[pos],wei);
if(l==r)return;
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<num)change(mid+1,r,rson,num,wei);
else change(l,mid,lson,num,wei);
}
int query(int l,int r,int pos,int L,int R,int num){
if(l>=L&&r<=R)return get_rank(root[pos],num);
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)return query(mid+1,r,rson,L,R,num);
else if(mid>=R)return query(l,mid,lson,L,R,num);
else return query(l,mid,lson,L,R,num)+query(mid+1,r,rson,L,R,num);
}
void Add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y){Add(x,y),Add(y,x);}
void dfs(int x){
siz[x]=1;
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa[x]){
fa[v[i]]=x,deep[v[i]]=deep[x]+1;
dfs(v[i]),siz[x]+=siz[v[i]];
if(siz[v[i]]>siz[son[x]])son[x]=v[i];
}
}
void dfs2(int x,int tp){
top[x]=tp,ch[x]=++cnt;
insert(1,n,1,cnt,t[x]);
if(son[x])dfs2(son[x],tp);
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa[x]&&v[i]!=son[x])
dfs2(v[i],v[i]);
}
int find(int x,int y,int num){
int fx=top[x],fy=top[y],tmp=0;
while(fx!=fy){
if(deep[fx]<deep[fy])swap(fx,fy),swap(x,y);
tmp+=query(1,n,1,ch[fx],ch[x],num);
x=fa[fx],fx=top[x];
}
if(deep[x]>deep[y])swap(x,y);
return tmp+query(1,n,1,ch[x],ch[y],num);
}
void b_srch(){
int l=0,r=inf,ans;
while(l<=r){
int mid=(l+r)>>1;
if(find(xx,yy,mid)>=op)l=mid+1;
else ans=mid,r=mid-1;
}
if(!ans)puts("invalid request!");
else printf("%d\n",ans);
}
int main(){
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)scanf("%d",&t[i]);
for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy);
dfs(1),dfs2(1,1);
for(int i=1;i<=q;i++){
scanf("%d%d%d",&op,&xx,&yy);
if(op)b_srch();
else change(1,n,1,ch[xx],yy),t[xx]=yy;
}
}

最新文章

  1. zookeeper原理解析-客户端与服务器端交互
  2. 检查Linux服务器性能
  3. 高德地图纯js和html
  4. Spring学习(三)
  5. 170105、MySQL 性能优化的最佳 20+ 条经验
  6. SHINY-SERVER R(sparkR)语言web解决方案 架设shiny服务器
  7. Vue基础----&gt;VueJS的使用(一)
  8. 金子上的友情[XDU1011]
  9. chrome浏览器插件window resizer调试webapp页面大小
  10. (《数论及应用1.3》NEFU 116 两仪剑法(最小公倍数&amp;&amp;最大公约数))
  11. C++模板实例化(1)
  12. java ServerSocket服务端编程
  13. bzoj 2301 [HAOI2011]Problem b(莫比乌斯反演)
  14. Binder机制,从Java到C (大纲)
  15. UVa 357 - Let Me Count The Ways
  16. Zookeeper 笔记-应用场景
  17. timesten报错:error while loading shared libraries: libaio.so.1: cannot open shared object file : No such file or directory
  18. LeetCode算法题-Find Mode in Binary Search Tree(Java实现)
  19. python学习日记(编码再回顾)
  20. Python Selenium element is not reachable by keyboard

热门文章

  1. CF1029E Tree with Small Distances (贪心)
  2. ActiveMQ:JMS开源框架入门介绍
  3. 紫书 习题 8-22 UVa 1622 (构造法)
  4. 【codeforces 20B】Equation
  5. Java基础学习总结(3)——抽象类
  6. vs解决方案里复制一个项目
  7. HDU 2782 The Worm Turns (DFS)
  8. poj 2337 Catenyms 【欧拉路径】
  9. iOS数据持久化 -- Core Data
  10. Car Talk1