全WA,求大佬帮忙改一下
查看原帖
全WA,求大佬帮忙改一下
109931
WJX3078楼主2020/10/19 09:35
#include <iostream>
#include <cstdio>
#include <cctype>
#define il inline
#define ll long long
#define int long long
#define R register
#define gc getchar
using namespace std;
il int read()
{
	int x=0;bool f=1;char ch=gc();
	while(!isdigit(ch)) {if(ch=='-') f=0;ch=gc();}
	while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
	return f?x:-x;
}

const int MAXN=1e5+10,MOD=1e9+9;
int n,q,ans;
int a[MAXN];

struct node{
	int hurt,protect;		//伤害,护盾; 
	int leftson,rightson;
	bool blast;		//是否爆盾 
}tree[MAXN<<2];
il void build(int k,int l,int r)
{
	if(l==r)
	{
		if(a[l]) tree[k].protect=a[l];
		else tree[k].blast=1;
		return ;
	}
	int mid=(l+r)>>1;
	tree[k].leftson=(k<<1);tree[k].rightson=((k<<1)|1);
	build(k<<1,l,mid);build((k<<1)|1,mid+1,r);
}

il void add(int k,int l,int r,int v)
{
	tree[k].hurt+=v;
	if(tree[k].blast) tree[k].hurt+=v;
	if(tree[k].hurt>=tree[k].protect&&l==r) tree[k].blast=1;
}

il void pushdown(int k,int l,int r)
{
	if(!tree[k].hurt) return ;
	int mid=(l+r)>>1;
	add(tree[k].leftson,l,mid,tree[k].hurt);
	add(tree[k].rightson,mid+1,r,tree[k].hurt);
	tree[k].hurt=0;
}

il void change(int k,int l,int r,int x,int y,int v)
{
	if(x<=l&&r<=y) return add(k,l,r,v);
	int mid=(l+r)>>1;
	if(tree[k].hurt) pushdown(k,l,r);
	if(x<=mid) change(k<<1,l,mid,x,y,v);
	if(mid<y) change((k<<1)|1,mid+1,r,x,y,v);
}

il ll ask(int k,int l,int r,int x)
{
	if(l==r&&l==x) return tree[k].hurt;
	int mid=(l+r)>>1;
	pushdown(k,l,r);
	if(x<=mid) return ask(tree[k].leftson,l,mid,x);
	else return ask(tree[k].rightson,mid+1,r,x);
}


signed main()
{
	n=read();q=read();
	for(R int i=1;i<=n;++i) a[i]=read();
	build(1,1,n);
	while(q--)
	{
		char opt[3];
		scanf("%s",&opt);
		if(*opt=='A')
		{
			int l=read(),r=read(),v=read();
			change(1,1,n,l,r,v);
		}
		else {
			int x=read();
			ans+=ask(1,1,n,x);ans%=MOD;
			//cout<<ask(1,1,n,x)<<endl;
		}
	}
	printf("%lld",ans);
	return 0;
}













2020/10/19 09:35
加载中...