Submission #1331765

#TimeUsernameProblemLanguageResultExecution timeMemory
1331765boclobanchatStreet Lamps (APIO19_street_lamps)C++20
20 / 100
1962 ms243740 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
struct upd { int l,r; };
struct query { int t,l,r,val,idx; };
bool comp(query a,query b)
{
	if(a.idx==b.idx) return a.t<b.t;
	return a.idx<b.idx;
}
namespace fen1
{
	int fen[MAXN][2],pos[MAXN],cnt;
	bool ck[MAXN];
	void init()
	{
		cnt=0;
	}
	void update(int i,int n,int val)
	{
		for(int a=i;a<=n;a+=a&-a)
		{
			fen[a][0]+=val*(i-1),fen[a][1]+=val;
			if(!ck[a]) pos[++cnt]=a,ck[a]=true;
		}
	}
	int get(int i)
	{
		int ans=0;
		for(int a=i;a;a-=a&-a) ans+=fen[a][1]*i-fen[a][0];
		return ans;
	}
	void reset()
	{
		for(int i=1;i<=cnt;i++) ck[pos[i]]=false,fen[pos[i]][0]=fen[pos[i]][1]=0;
		cnt=0;
	}
}
namespace fen2
{
	int fen[MAXN],ck[MAXN];
	int getlog(long long n) { return 63-__builtin_clzll(n); }
	void update(int i,int n,int val)
	{
		if(!(val-=ck[i])) return ;
		ck[i]+=val;
		for(;i<=n;i+=i&-i) fen[i]+=val;
	}
	int get(int i)
	{
		int ans=0;
		for(;i;i-=i&-i) ans+=fen[i];
		return ans;
	}
	int walk(int n,int val)
	{
		int ans=0;
		for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>=fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];
		return ans+1;
	}
}
namespace seg
{
	int seg[MAXN*4];
	void update(int l,int r,int u,int v,int val,int pos)
	{
		if(v<l||r<u) return ;
		if(u<=l&&r<=v)
		{
			seg[pos]=val;
			return ;
		}
		int mid=(l+r)/2;
		if(seg[pos]) seg[pos*2]=seg[pos*2+1]=seg[pos],seg[pos]=0;
		update(l,mid,u,v,val,pos*2);
		update(mid+1,r,u,v,val,pos*2+1);
	}
	int get(int l,int r,int i,int pos)
	{
		while(l<r)
		{
			int mid=(l+r)/2;
			if(seg[pos]) seg[pos*2]=seg[pos*2+1]=seg[pos],seg[pos]=0;
			if(i<=mid) r=mid,pos*=2;
			else l=mid+1,pos=pos*2+1;
		}
		return seg[pos];
	}
}
int ans[MAXN],state[MAXN],T[MAXN];
vector<query> vq[MAXN];
vector< pair<int,int> > vi[MAXN];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,q;
    string s;
    cin>>n>>q>>s;
    s=' '+s;
    for(int i=1;i<=n;i++) T[i]=1,state[i]='1'-s[i];
    for(int i=1;i<=q;i++)
    {
    	string type;
    	cin>>type;
    	if(type=="query")
    	{
    		int a,b;
    		cin>>a>>b;
    		b--;
    		for(int p=a;p;p-=p&-p) vq[p].push_back({2,0,0,i,b});
		}
		else
		{
			int x;
			cin>>x;
			ans[i]=-1,state[x]^=1;
			if(!state[x]) vi[x].push_back({T[x],i});
			else T[x]=i;
		}
	}
	fen1::init();
	state[0]=T[0]=1;
	for(int i=0;i<=n;i++)
	{
		if(state[i]) vi[i].push_back({T[i],q});
		for(auto v:vi[i])
		{
			int pre=v.first,nex,res=fen2::get(v.first),val;
			while(pre<=v.second)
			{
				nex=fen2::walk(q,res),val=seg::get(1,q,pre,1);
				if(val) for(int a=val;a<=n+1;a+=a&-a) vq[a].push_back({1,pre,min(nex-1,v.second),-1,i});
				if(nex<=v.second) fen2::update(nex,q,0);
				pre=nex;
			}
			fen2::update(v.first,q,1);
			fen2::update(v.second+1,q,1);
			seg::update(1,q,v.first,v.second,i+1,1);
			for(int a=i+1;a<=n+1;a+=a&-a) vq[a].push_back({1,v.first,v.second,1,i});
		}
	}
	for(int i=1;i<=n+1;i++)
	{
		sort(vq[i].begin(),vq[i].end(),comp);
		for(auto v:vq[i]) if(v.t==1)
		{
			fen1::update(v.l,q,v.val);
			fen1::update(v.r+1,q,-v.val);
		}
		else ans[v.val]+=fen1::get(v.val);
		fen1::reset();
	}
	for(int i=1;i<=q;i++) if(ans[i]!=-1) cout<<ans[i]<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...