来个dalao吧,心态快炸了,调一天了,一直都是第17个点炸
查看原帖
来个dalao吧,心态快炸了,调一天了,一直都是第17个点炸
230808
Zxsoul楼主2020/10/31 20:25

一直都是第17个点炸

/*
Name:
Author:BZQ
Date: 
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;

const int manx=1e6+10;
const int mamx = 1e7 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

inline int read() {
  char c = getchar(); int x = 0, f = 1;
  for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
  for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
  return x * f;
}

struct nodee{
	int l,r;
	ll sum;
	ll add;
}e[1600040];
int clr[400040];
struct node{
    int u;
    int v;
    int nxt;
    int w;
}ee[800000];

int head[400040],js,l[400040],r[400040],cnt,n,m,dfn[manx];
void add(int u,int v){
    ee[++cnt].u = u;
    ee[cnt].nxt = head[u];
    ee[cnt].v = v;
    //e[cnt].w = w;
    head[u] = cnt;
}
inline void init(){
    cnt=js=0;
    clr(head,-1);
}
void dfs(int u, int pre){
    js++;
    l[u] = js;
    dfn[js] = u;    
    for(int i = head[u];~i;i = ee[i].nxt){
        int v = ee[i].v;
        if( v == pre ) continue;
        dfs(v,u);
    }
    r[u] = js; 
	return; 
}
void uploat(int s){
	e[s].sum = 0;
	if(e[s<<1].l) e[s].sum |=e[s<<1].sum ;
	if(e[s<<1|1].l ) e[s].sum |=e[s<<1|1].sum ;
	return;
}
void downloat(int i){
	if(e[i].add !=0){
		int s = e[i].add ;
		e[i<<1].sum = s;
		e[i<<1].add = s;
		e[i<<1|1].add = s;	
		e[i<<1|1].sum = s;
	 e[i].add = 0; 
	}
	return;
}
void build_up (int rt,int l,int r){
	e[rt].l = l;e[rt].r = r;
	if(l == r){
		e[rt].sum = (ll)1<<(clr[dfn[l]]);
		e[rt].add = 0;
		return;
	}
	int mid = (l+r) >> 1;
	build_up(rt<<1,l,mid);
	build_up(rt<<1|1,mid+1,r);
	e[rt].sum = e[rt<<1].sum | e[rt<<1|1].sum;
	return;
}

void updata(int i,int l,int r,int add){
	if(e[i].l >= l && e[i].r <= r)
	{
		e[i].sum = (ll)1<<add;
		e[i].add = (ll)1<<add;
		return;
	}
	int mid = (e[i].l  + e[i].r ) >> 1;
	downloat(i);
	if(mid >= r)updata(i<<1,l,r,add);
	else if(mid <l)updata(i<<1|1,l,r,add);
	else updata(i<<1,l,mid,add),updata(i<<1|1,mid+1,r,add);
	uploat(i);
	return;
 }
ll query(int i,int l,int r)
{
   if(e[i].l >= l && e[i].r <= r){
   	   return e[i].sum ;
   }
   downloat(i);
   int mid = (e[i].l +e[i].r ) >> 1;
	if(mid >= r)  
		return  query(i<<1,l,r);
	else 
		if(mid<l)
		return  query(i<<1|1,l,r);
		return  query(i<<1,l,mid) | query(i<<1|1,mid+1,r);
}
ll lowbit(ll x){
	return x&-x;
}
int main(){
    n = read();
    m = read();
	memset(head,-1,sizeof(head));
    for(int i = 1;i <= n;i ++)
    	clr[i] = read();
    for(int i = 1;i <= n - 1;i ++)
    {
    	int x = read(),y = read();
    	add(x,y);
    	add(y,x);
	} 
	dfs(1,0);
	build_up(1,1,n);
	for(int i = 1;i <= m; i++)
	{
		int x = read();
		int y;
		int z;
		if(x == 1){
			y = read();
			z = read();
		  updata(1,l[y],r[y],z);	
		}
		else{
			int ans = 0;
			y = read();
			ll diet = query(1,l[y],r[y]);
			while(diet>0){
				diet-=lowbit(diet);
				ans++;
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}

2020/10/31 20:25
加载中...