Advertisement
yuhung94

7172

Feb 12th, 2023
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. #pragma GCC optimzize("Ofast,no-stack-protector")
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #define quick ios::sync_with_stdio(0);cin.tie(0);
  5. #define rep(x,a,b) for(int x=a;x<=b;x++)
  6. #define repd(x,a,b) for(int x=a;x>=b;x--)
  7. #define lowbit(x) (x&-x)
  8. #define sz(x) (int)(x.size())
  9. #define F first
  10. #define S second
  11. #define all(x) x.begin(),x.end()
  12. #define mp make_pair
  13. #define eb emplace_back
  14. using namespace std;
  15. typedef complex<int> P;
  16. #define X real()
  17. #define Y imag()
  18. typedef pair<int,int> pii;
  19. void debug(){
  20.     cout<<"\n";
  21. }
  22. template <class T,class ... U >
  23. void debug(T a, U ... b){
  24.     cout<<a<<" ",debug(b...);
  25. }
  26. const int N=1e6+7;
  27. const int INF=1e18;
  28.  
  29. //bit
  30. int bit[N];
  31. void add(int x,int val){
  32.     for(;x<N;x+=lowbit(x)) bit[x]+=val;
  33. }
  34. int query(int x){
  35.     int ret=0;
  36.     for(;x>0;x-=lowbit(x)) ret+=bit[x];
  37.     return ret;
  38. }
  39.  
  40. //cdq
  41. struct event{
  42.     int t;
  43.     int x;
  44.     int pos;
  45.     int val;//add / query add/minus
  46.     int querynum;// 0->add, else query
  47.     event(int t,int x,int pos,int val,int querynum): t(t),x(x),pos(pos),val(val),querynum(querynum){
  48.     }
  49.     event(){
  50.         t=x=pos=val=querynum=0;
  51.     }
  52.     bool operator < (event&o) const{
  53.         if(t!=o.t) return t<o.t;
  54.         if(x!=o.x) return x<o.x;
  55.         return pos<o.pos;
  56.     }
  57. }v[N];
  58. struct qry{
  59.     int c;
  60.     int x;
  61.     int l,r;
  62. }qry[N];
  63. int ans[N];
  64. void cdq(int l,int r){
  65.     if(l==r) return ;
  66.     int mid=(l+r)>>1;
  67.     cdq(l,mid);
  68.     cdq(mid+1,r);
  69.     vector<pii> undo;
  70.     vector<event> rcd;
  71.     int s1=l;
  72.     int s2=mid+1;
  73.     while(s1<=mid||s2<=r){
  74.         if(s2>r||(s1<=mid&&v[s1].x<=v[s2].x)){
  75.             if(!v[s1].querynum){//add
  76.                 add(v[s1].pos,v[s1].val);
  77.                 undo.eb(v[s1].pos,v[s1].val);
  78.             }
  79.             rcd.eb(v[s1++]);
  80.         }
  81.         else{
  82.             if(v[s2].querynum){
  83.                 ans[v[s2].querynum]+=v[s2].val*query(v[s2].pos);
  84.             }
  85.             rcd.eb(v[s2++]);
  86.         }
  87.     }
  88.     rep(i,l,r) v[i]=rcd[i-l];
  89.     for(pii p2:undo){
  90.         add(p2.F,-p2.S);
  91.     }
  92.  
  93. }
  94.  
  95.  
  96. //dfs tree
  97. vector<int> e[N];
  98. int in[N];
  99. int out[N];
  100. int t;
  101. int a[N];
  102. void dfs(int x,int p=-1){
  103.     in[x]=t++;
  104.     for(int i:e[x]){
  105.         if(i!=p) dfs(i,x);
  106.     }
  107.     out[x]=t++;
  108. }
  109. signed main(){
  110.     //quick
  111.     vector<int> num;
  112.     int n,q;
  113.     cin>>n>>q;
  114.     rep(i,1,n){
  115.         cin>>a[i];
  116.         num.eb(a[i]);
  117.     }
  118.     rep(i,1,n-1){
  119.         int b,c;
  120.         cin>>b>>c;
  121.         e[b].eb(c);
  122.         e[c].eb(b);
  123.     }
  124.  
  125.     t=1;
  126.     dfs(1);
  127.     rep(i,1,q){
  128.         cin>>qry[i].c;
  129.         if(qry[i].c==1){
  130.             cin>>qry[i].x>>qry[i].l;
  131.             num.eb(qry[i].l);
  132.         }
  133.         else{
  134.             cin>>qry[i].x>>qry[i].l>>qry[i].r;
  135.             --qry[i].l;// [l,r] -> (l,r]
  136.             num.eb(qry[i].l);
  137.             num.eb(qry[i].r);
  138.         }
  139.     }
  140.     sort(all(num));
  141.     num.erase(unique(all(num)),num.end());
  142.     rep(i,1,n){
  143.         a[i]=upper_bound(all(num),a[i])-num.begin();
  144.     }
  145.     rep(i,1,q){
  146.         if(qry[i].c==1){
  147.             qry[i].l=upper_bound(all(num),qry[i].l)-num.begin();
  148.         }
  149.         else{
  150.             qry[i].l=upper_bound(all(num),qry[i].l)-num.begin();
  151.             qry[i].r=upper_bound(all(num),qry[i].r)-num.begin();
  152.         }
  153.     }
  154.     int cnt=0;
  155.     rep(i,1,n){
  156.         v[cnt++]=event(0,in[i],a[i],1,0);
  157.     }
  158.     int qnum=1;
  159.     rep(i,1,q){
  160.         if(qry[i].c==2){
  161.             int y1=qry[i].l;
  162.             int x1=in[qry[i].x]-1;
  163.             int y2=qry[i].r;
  164.             int x2=out[qry[i].x];
  165.             v[cnt++]=event(i,x1,y1,1,qnum);
  166.             v[cnt++]=event(i,x2,y2,1,qnum);
  167.             v[cnt++]=event(i,x1,y2,-1,qnum);
  168.             v[cnt++]=event(i,x2,y1,-1,qnum);
  169.             qnum++;
  170.         }
  171.         else{
  172.             int p=qry[i].x;
  173.             int last=a[p];
  174.             v[cnt++]=event(i,in[p],last,-1,0);
  175.             v[cnt++]=event(i,in[p],qry[i].l,1,0);
  176.             a[p]=qry[i].l;
  177.         }  
  178.     }
  179.     sort(v,v+cnt);
  180.     cdq(0,cnt-1);
  181.     rep(i,1,qnum-1) cout<<ans[i]<<"\n";
  182.  
  183.     return 0;
  184. }
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement