Wa 求助。
查看原帖
Wa 求助。
868864
zjinze楼主2024/4/4 20:45
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) x&-x
const int N=3e5+7;
const int mod=1e9+7;
int x,p,n,q,a[N],tree[N],tree2[N];
void add(int x,int value){
	for(int i=x;i<=n;i+=lowbit(i)){
		tree[i]+=value;
	}
	return ;
}
int query(int x){
	int ans=0;
	for(int i=x;i>=1;i-=lowbit(i)){
		ans+=tree[i];	
	}
	return ans;
}
void add2(int x,int value){
	for(int i=x;i<=n;i+=lowbit(i)){
		tree2[i]+=value;
	}
	return ;
}
int query2(int x){
	int ans=0;
	for(int i=x;i>=1;i-=lowbit(i)){
		ans+=tree2[i];	
	}
	return ans;
}
int ksm(int a,int b){
	int tmp=1;
	while(b){
		if(b&1){
			tmp=tmp*a;
			tmp%=mod;
		}
		a*=a;
		a%=mod;
		b>>=1;
	}
	return tmp;
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]==0){
			add(i,1);
		}
		add2(i,a[i]);
	}
	while(q--){
		cin>>x>>p;
		if(a[x]==0 && p!=0){
			add(x,-1);
		}
		if(a[x]!=0 && p==0){
			add(x,1);
		}
		add2(x,-a[x]);
		a[x]=p;	
		add2(x,p);
		int l=1,r=n,mid;
		while(l<r){
			mid=(l+r)>>1;
			if(query2(n)-query2(mid)==0){
				r=mid;
			}
			else{
				l=mid+1;
			}
		}
		int cnt;
		if(a[l]==0){
			for(cnt=l;cnt>=1 && a[cnt-1]==0;cnt--){
			}
		}
		else cnt=l;
		int pos=query(cnt);
		cout<<ksm(2,cnt-pos)<<"\n";
	}
	return 0;
}
2024/4/4 20:45
加载中...