Advertisement
Alhiris

Untitled

Dec 20th, 2018
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.46 KB | None | 0 0
  1.    
  2. #include <fstream>
  3.    
  4. #include <vector>
  5.    
  6. #include <algorithm>
  7.    
  8. using namespace std;
  9.    
  10. ifstream cin("heavypath.in");
  11.    
  12. ofstream cout("heavypath.out");
  13.    
  14. #define maxn 100050
  15.    
  16. #define pb push_back
  17.    
  18. int maxim(int a,int b){if(a>b)return a;return b;}
  19.    
  20. void swap(int&a,int&b){int aux=a;a=b,b=aux;}
  21.    
  22.  
  23.    
  24. vector <int> g[maxn];
  25.    
  26. int v[maxn], n, T;
  27.    
  28. int viz[maxn],w[maxn],niv[maxn];
  29.    
  30. int nL;
  31.    
  32. int l[maxn],lDim[maxn],lNiv[maxn],lTata[maxn],lDif[maxn];
  33.    
  34. vector <int>Chains[maxn];
  35.    
  36. int arb[4*maxn];
  37.    
  38.  
  39.    
  40. void df(int);
  41.    
  42. void make_paths();
  43.    
  44. void build(int,int,int,int,int);
  45.    
  46. int querry(int,int,int,int,int,int);
  47.    
  48. void update(int,int,int,int,int,int);
  49.    
  50.  
  51.    
  52. int main()
  53.    
  54. {
  55.    
  56.     int x,y,t;
  57.    
  58.     cin>>n>>T;
  59.    
  60.     for(int i=1;i<=n;++i)
  61.    
  62.         cin>>v[i];
  63.    
  64.     for(int i=1;i<n;++i){
  65.    
  66.         cin>>x>>y;
  67.    
  68.         g[x].pb(y);
  69.    
  70.         g[y].pb(x);
  71.    
  72.     }
  73.    
  74.     make_paths();
  75.    
  76.     int sol;
  77.    
  78.     for(;T--;){
  79.    
  80.         cin>>t>>x>>y;
  81.    
  82.         if(t==0)
  83.    
  84.             update(1,1,lDim[l[x]],lDif[l[x]],niv[x]-lNiv[l[x]],y);
  85.    
  86.         else{
  87.    
  88.             sol=-1;
  89.    
  90.             while(1){
  91.    
  92.                 if(l[x]==l[y]){
  93.    
  94.                     if(niv[x]>niv[y])
  95.    
  96.                         swap(x,y);
  97.    
  98.                     sol=maxim(sol,querry(1,1,lDim[l[x]],niv[x]-lNiv[l[x]],niv[y]-lNiv[l[x]],lDif[l[x]]));
  99.    
  100.                     break;
  101.    
  102.                 }
  103.    
  104.                 if(lNiv[l[x]]<lNiv[l[y]])
  105.    
  106.                     swap(x,y);
  107.    
  108.                 sol=maxim(sol,querry(1,1,lDim[l[x]],1,niv[x]-lNiv[l[x]],lDif[l[x]]));
  109.    
  110.                 x=lTata[l[x]];
  111.    
  112.             }
  113.    
  114.             cout<<sol<<'\n';
  115.    
  116.         }
  117.    
  118.     }
  119.    
  120. }
  121.    
  122.  
  123.    
  124. void df(int nod)
  125.    
  126. {
  127.    
  128.     int mNods=-1,frunza=1;
  129.    
  130.     viz[nod]=1;
  131.    
  132.     w[nod]=1;
  133.    
  134.  
  135.    
  136.     for(auto it:g[nod])
  137.    
  138.         if(!viz[it]){
  139.    
  140.             frunza=0;
  141.    
  142.             niv[it]=niv[nod]+1;
  143.    
  144.  
  145.    
  146.             df(it);
  147.    
  148.             w[nod]+=w[it];
  149.    
  150.             if(mNods==-1)
  151.    
  152.                 mNods=it;
  153.    
  154.             else
  155.    
  156.                 if(w[mNods]<w[it])
  157.    
  158.                     mNods=it;
  159.    
  160.         }
  161.    
  162.  
  163.    
  164.     if(frunza){
  165.    
  166.         l[nod]=++nL;
  167.    
  168.         lDim[l[nod]]=1;
  169.    
  170.         Chains[l[nod]].pb(nod);
  171.    
  172.         return;
  173.    
  174.     }
  175.    
  176.     l[nod]=l[mNods];
  177.    
  178.     ++lDim[l[nod]];
  179.    
  180.     Chains[l[nod]].pb(nod);
  181.    
  182.  
  183.    
  184.     for(auto it:g[nod]){
  185.    
  186.         if(mNods==it||niv[nod]>niv[it])
  187.    
  188.             continue;
  189.    
  190.         lNiv[l[it]]=niv[nod];
  191.    
  192.         lTata[l[it]]=nod;
  193.    
  194.     }
  195.    
  196. }
  197.    
  198.  
  199.    
  200. void build(int nod,int start,int end, int decalaj,int lant)
  201.    
  202. {
  203.    
  204.     if(start==end){
  205.    
  206.         arb[nod+decalaj]=v[Chains[lant][start-1]];
  207.    
  208.         return;
  209.    
  210.     }
  211.    
  212.     int mid=(start+end)/2;
  213.    
  214.     build(nod*2,start, mid, decalaj, lant);
  215.    
  216.     build(nod*2+1,mid+1,end,decalaj, lant);
  217.    
  218.     arb[nod+decalaj]=maxim(arb[nod*2+decalaj],arb[nod*2+1+decalaj]);
  219.    
  220. }
  221.    
  222.  
  223.    
  224. void make_paths()
  225.    
  226. {
  227.    
  228.     niv[1]=1;
  229.    
  230.     df(1);
  231.    
  232.     for(int i=1;i<=nL;++i){
  233.    
  234.         if(i>1)
  235.    
  236.             lDif[i]=lDif[i-1] + lDim[i-1]*4;
  237.    
  238.         reverse(Chains[i].begin(),Chains[i].end());
  239.    
  240.         build(1,1,lDim[i],lDif[i],i);
  241.    
  242.     }
  243.    
  244. }
  245.    
  246.  
  247.    
  248. void update(int nod, int start, int end,int decalaj, int poz, int val)
  249.    
  250. {
  251.    
  252.     if(start==end){
  253.    
  254.         arb[nod+decalaj]=val;
  255.    
  256.         return;
  257.    
  258.     }
  259.    
  260.     int mid=(start+end)/2;
  261.    
  262.     if(poz<=mid)
  263.    
  264.         update(nod*2,start, mid, decalaj, poz, val);
  265.    
  266.     else
  267.    
  268.         update(nod*2+1,mid+1,end,decalaj,poz,val);
  269.    
  270.     arb[nod+decalaj]=maxim(arb[nod*2+decalaj],arb[nod*2+1+decalaj]);
  271.    
  272. }
  273.    
  274.  
  275.    
  276. int querry(int nod, int start, int end, int qstart,int qend,int decalaj)
  277.    
  278. {
  279.    
  280.     if(qstart<=start&&end<=qend)
  281.    
  282.         return arb[nod+decalaj];
  283.    
  284.     int mid=(start+end)/2, rez=-1;
  285.    
  286.     if(qstart<=mid)
  287.    
  288.         rez=maxim(rez,querry(nod*2,start, mid, qstart, qend, decalaj));
  289.    
  290.     if(qend>mid)
  291.    
  292.         rez=maxim(rez,querry(nod*2+1,mid+1,end, qstart,qend, decalaj));
  293.    
  294.     return rez;
  295.    
  296. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement