Advertisement
Tranvick

COT

Mar 6th, 2013
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.27 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:65777216")
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <vector>
  10. #include <set>
  11. #include <stack>
  12. #include <map>
  13. #include <queue>
  14. #include <string>
  15. #include <memory.h>
  16. #include <iterator>
  17. #define y1 trololoy1
  18. #define y0 trololoy0
  19. #define mem(A,X) memset(A,X,sizeof(A))
  20. #define memo(A) memset(A,0,sizeof(A))
  21. #define forn(I,B) for (int I=1;I<=(B);I++)
  22. #define forg(H,V) for (int H=first[V];h;h=next[H])
  23. #define rep(I,B) for (int I=0;I<(B);I++)
  24. #define labs(X) (((X)>0)?(X):(-(X)))
  25. #define ropen(X) freopen(X,"r",stdin)
  26. #define wopen(X) freopen(X,"w",stdout)
  27. #define rwopen(X) freopen(X".in","r",stdin);freopen(X".out","w",stdout)
  28. #define pb push_back
  29. #define mp make_pair
  30. #define all(X) (X).begin(),(X).end()
  31. #define sqr(X) ((X)*(X))
  32.  
  33. using namespace std;
  34.  
  35. typedef pair <int,int> pii;
  36. typedef double ld;
  37. typedef long long ll;
  38. typedef pair <ll,ll> pll;
  39. typedef vector<int> vi;
  40. const int N=111111;
  41. const int L=16;
  42. const int INF=111111111;
  43. const double eps=1e-9;
  44. const double pi=3.14159265358979;
  45.  
  46. struct tree{
  47.     int sum;
  48.     tree *l,*r;
  49.     tree(){}
  50.     tree(int value):l(NULL),r(NULL),sum(value){}
  51.     tree(tree* l, tree *r):l(l),r(r){
  52.         sum=l->sum+r->sum;
  53.     }
  54.      
  55. } t[N];
  56. typedef tree* ptree;
  57.  
  58. ptree root[N];
  59. int es[N+N],next[N+N],up[N][L+1],n,m,a[N],tin[N],tout[N],c,timer,sorted[N],first[N];
  60.  
  61. inline void add(int x,int y){
  62.     next[++c]=first[x];first[x]=c;
  63.     es[c]=y;
  64. }
  65.  
  66. inline bool upper(int x,int y){
  67.     return tin[x]<=tin[y] && tout[x]>=tout[y];
  68. }
  69.  
  70. ptree build(int l,int r){
  71.     if (l==r) return new tree(0);
  72.     return new tree(build(l,(l+r)/2),build((l+r)/2+1,r));
  73. }
  74.  
  75. int getsum(ptree t,int l,int r,int tl,int tr){
  76.     if (tl>r || tr<l) return 0;
  77.     if (tl>=l && tr<=r) return t->sum;
  78.     return getsum(t->l,l,r,tl,(tl+tr)/2)+getsum(t->r,l,r,(tl+tr)/2+1,tr);
  79. }
  80.  
  81. ptree modify(ptree t,int pos,int value,int tl,int tr){
  82.     if (tl==tr) return new tree(value);
  83.     else {
  84.         if (pos<=(tl+tr)/2) return new tree(modify(t->l,pos,value,tl,(tl+tr)/2),t->r);
  85.         else return new tree(t->l,modify(t->r,pos,value,(tl+tr)/2+1,tr));  
  86.     }
  87. }
  88.  
  89. inline int lca(int a,int b){
  90.     if (upper(a,b)) return a;
  91.     if (upper(b,a)) return b;
  92.     for (int i=L;i>=0;--i) if (!upper(up[a][i],b)) a=up[a][i];
  93.     return up[a][0];
  94. }
  95.  
  96. void dfs(int v,int p=1){
  97.     tin[v]=++timer;
  98.     up[v][0]=p;
  99.     forn(i,L) up[v][i]=up[up[v][i-1]][i-1];
  100.     if (v!=1) root[v]=modify(root[p],a[v],getsum(root[p],a[v],a[v],1,n)+1,1,n);
  101.     else root[v]=modify(root[0],a[v],1,1,n);
  102.     forg(h,v) if (es[h]!=p) dfs(es[h],v);
  103.     tout[v]=++timer;
  104. }
  105.  
  106. int get_k(ptree p, ptree q,int k,int tl,int tr){
  107.     if (tl==tr) return tl;
  108.     if (q->l->sum-p->l->sum>=k) return get_k(p->l,q->l,k,tl,(tl+tr)/2);
  109.     else return get_k(p->r,q->r,k-q->l->sum+p->l->sum,(tl+tr)/2+1,tr);
  110. }                    
  111.  
  112. int get_k(ptree p, ptree q, ptree lc, int value,int k,int tl,int tr){
  113.     if (tl==tr) return tl;
  114.     if (value<=(tl+tr)/2 && value>=tl){
  115.         if (p->l->sum+q->l->sum-2*lc->l->sum+1>=k) return get_k(p->l,q->l,lc->l,value,k,tl,(tl+tr)/2);
  116.         else return get_k(p->r,q->r,lc->r,value,k-(p->l->sum+q->l->sum-2*lc->l->sum+1),(tl+tr)/2+1,tr);
  117.     } else {
  118.         if (p->l->sum+q->l->sum-2*lc->l->sum>=k) return get_k(p->l,q->l,lc->l,value,k,tl,(tl+tr)/2);
  119.         else return get_k(p->r,q->r,lc->r,value,k-(p->l->sum+q->l->sum-2*lc->l->sum),(tl+tr)/2+1,tr);
  120.     }
  121. }      
  122.  
  123. int get_k(ptree p,int k,int tl,int tr){
  124.     if (tl==tr) return tl;
  125.     if (p->l->sum>=k) return get_k(p->l,k,tl,(tl+tr)/2);
  126.     else return get_k(p->r,k-p->l->sum,(tl+tr)/2+1,tr);
  127. }
  128.  
  129. inline void query(int a,int b,int k){
  130.     int lc=lca(a,b);
  131.     if (lc==b) swap(a,b);
  132.     if (lc==a){
  133.         if (a>1) printf("%d\n",sorted[get_k(root[up[a][0]],root[b],k,1,n)]);
  134.         else printf("%d\n",sorted[get_k(root[b],k,1,n)]);
  135.     } else printf("%d\n",sorted[get_k(root[a],root[b],root[lc],::a[lc],k,1,n)]);
  136. }
  137.  
  138. int main(){
  139. //  ropen("input.txt");
  140. //  wopen("output1.txt");
  141.     scanf("%d%d",&n,&m);
  142.     forn(i,n) scanf("%d",&a[i]);
  143.     forn(i,n) sorted[i]=a[i];
  144.     sort(sorted+1,sorted+n+1);
  145.     forn(i,n) a[i]=lower_bound(sorted+1,sorted+n+1,a[i])-sorted;
  146.     forn(i,n-1){
  147.         int x,y;
  148.         scanf("%d%d",&x,&y);
  149.         add(x,y);add(y,x);
  150.     }
  151.     root[0]=build(1,n);
  152.     dfs(1);
  153.     forn(i,m){
  154.         int a,b,k;
  155.         scanf("%d%d%d",&a,&b,&k);
  156.         query(a,b,k);
  157.     }
  158.     return 0;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement