萌新求助,27分错两个点
查看原帖
萌新求助,27分错两个点
553625
scp020楼主2023/11/8 22:47

提交记录: https://www.luogu.com.cn/record/134066295

#include<bits/stdc++.h>
namespace fast_IO
{
	/**
	 * 快读快写无误
    */
};
using namespace fast_IO;
int n,m,w,a[500010],pre[500010],ed[500010];
std::unordered_map< int,std::set<int> > mp;
class seg_tree
{
	/**
	 * 线段树无误
    */
};
seg_tree tree;
std::vector< std::pair<int,int> > v;
inline void addget(const int &val,const int &it)
{
	v.push_back(std::make_pair(val,it));
}
inline void getpre(const int &val,const int &it)
{
	if(val*2==w)
	{
		std::set<int>::iterator it2=mp[val].find(it);
		if(it2==mp[val].begin()) pre[it]=-1,tree.fix(it,pre[it]);
		else it2--,pre[it]=*it2,tree.fix(it,pre[it]);
		return;
	}
	std::set<int>::iterator it2=mp[w-val].lower_bound(it),it3=mp[val].find(it);
	if(it2==mp[w-val].begin())
	{
		pre[it]=-1,tree.fix(it,pre[it]);
		return;
	}
	it2--,pre[it]=*it2,tree.fix(it,pre[it]);
	if(it3!=mp[val].begin())
	{
		it3--;
		if(pre[*it3]==pre[it]) pre[it]=-1,tree.fix(it,pre[it]);
	}
}
inline void deladd()
{
	for(int i=0;i<v.size();i++) getpre(v[i].first,v[i].second);
	v.clear();
}
int main()
{
	read(n),read(m),read(w);
	for(int i=1;i<=n;i++) read(a[i]);
	std::set<int>::iterator it1,it2,it3;
	for(int i=1,prev;i<=n;i++)
	{
		if(!mp[w-a[i]].size()) pre[i]=-1;
		else
		{
			prev=*(--mp[w-a[i]].end());
			if(ed[prev]) pre[i]=-1;
			else pre[i]=prev,ed[prev]=1;
		}
		mp[a[i]].insert(i);
	}
	tree.build();
	for(int i=1,op,l,r,ans=0;i<=m;i++)
	{
		read(op),read(l),read(r);
		if(op==1)
		{
			it1=mp[a[l]].find(l),it2=mp[w-a[l]].lower_bound(l);
			if(it2!=mp[w-a[l]].end()) addget(w-a[l],*it2);
			if(it1!=mp[a[l]].end())
			{
				it1++;
				if(it1!=mp[a[l]].end()) addget(a[l],*it1);
			}
			mp[a[l]].erase(l),mp[r].insert(l),a[l]=r;
			it1=mp[a[l]].find(l),it2=mp[w-a[l]].lower_bound(l),addget(a[l],*it1);
			if(it2!=mp[w-a[l]].end()) addget(w-a[l],*it2);
			if(it1!=mp[a[l]].end())
			{
				it1++;
				if(it1!=mp[a[l]].end()) addget(a[l],*it1);
			}
			deladd();
		}else
		{
			l^=ans,r^=ans;
			if(tree.ask(l,r)>=l) write("Yes\n"),ans++;
			else write("No\n");
		}
		// debug();
	}
	fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
	return 0;
}
2023/11/8 22:47
加载中...