所以为什么会T
查看原帖
所以为什么会T
1021736
10998qwert楼主2024/5/4 21:06
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1100010;
ll n,q;
ll v[N];
ll op,x,y;
struct Tree{
	ll l,r,num,sum;
} t[5*N+10];

ll read() {
	ll x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
void write(ll t){
	if(t>=10) write(t/10);
	putchar(t%10+48);
}
bool check(ll x,ll y){
	if(x|y==y) return true;
	return x&y;
}
void build(ll q,ll L,ll R) {
	if(q>4*N+10)
	{
		return;
	}
	t[q].l=L;
	t[q].r=R;
	if(L==R) {
		t[q].num=v[L];
		t[q].sum=L;
		return ;
	}
	ll mid=(L+R)/2;
	build(q<<1,L,mid);
	build(q<<1|1,mid+1,R);
	t[q].sum=t[q<<1].sum|t[q<<1|1].sum;
	t[q].num=t[q<<1].num+t[q<<1|1].num;
}
void change(ll q,ll s,ll d) {
	if(q>4*N+10)
	{
		return;
	}
	if(t[q].l>=s&&t[q].r<=s) {
		t[q].num=d;
		return ;
	}
	ll mid=(t[q].l+t[q].r)/2;
	if(s<=mid) change(q<<1,s,d);
	if(s>mid) change(q<<1|1,s,d);
	t[q].num=t[q<<1].num+t[q<<1|1].num;
}
ll ask(ll q,ll s) {
	if(q>4*N+10)
	{
		return 0;
	}
	if((s|t[q].sum)==s) {
		return t[q].num;
	}
	if(t[q].l==t[q].r) {
		return 0;
	}
	ll ans=0;
	if(check(t[q<<1].sum,s)){
		ans+=ask(q<<1,s);
	}
	if(check(t[q<<1|1].sum,s)){
		ans+=ask(q<<1|1,s);
	}	
	return ans;
}
signed main() {
	n=read();
	q=read();
	n=1<<n;
	for(ll i=0; i<n; i++) {
		v[i]=read();
	}
	build(1,0,n-1);
	while(q--) {
		op=read();
		x=read();
		if(op==1) {
			write(ask(1,x));
			puts("");
		} else if(op==2) {
			y=read();
			change(1,x,y);
		}
	}
}
2024/5/4 21:06
加载中...