Submission #1360124

#TimeUsernameProblemLanguageResultExecution timeMemory
1360124Jawad_Akbar_JJStreet Lamps (APIO19_street_lamps)C++20
60 / 100
818 ms70964 KiB
#include <iostream>
#include <random>
#include <chrono>

using namespace std;
const int N = 1<<19;
string t[N], S[N], s;
int l[N], r[N], Sz, Sum[N<<1], Lz[N<<1], L[N], R[N];
vector<pair<int,int>> vec[N];
vector<int> tgl[N], Mid[N];

void sub1(int n, int q){
	S[0] = s;
	for (int i=1;i<=q;i++){
		S[i] = S[i-1];
		if (t[i][0] == 'q'){
			int ans = 0;
			for (int j=0;j<i;j++){
				bool T = 1;
				for (int k=l[i];k<r[i];k++)
					T &= S[j][k-1] - '0';
				ans += T;
				// cout<<l[i]<<' '<<r[i]<<' '<<S[j]<<' '<<T<<endl;
			}
			cout<<ans<<'\n';
		}
		else
			S[i][l[i]-1] ^= 1; 
	}
}

void sub2(int n, int q){
	for (int i=1;i<=n;i++){
		if (s[i-1] == '1')
			vec[i].push_back({0, 0});
	}

	for (int i=1;i<=q;i++){
		if (t[i][0] == 't')
			vec[l[i]].push_back({0, i});
		else
			vec[l[i]].push_back({1, i});
	}

	vector<int> ans(q);
	for (int i=1;i<=n;i++){
		int lst = 0, st = 0, Ans = 0;
		for (auto [tp, T] : vec[i]){
			if (tp == 0){
				if (st == 1)
					Ans += T - lst;
				st ^= 1;
				lst = T;
			}
			else
				ans[T-1] = Ans + st * (T - lst);
		}
	}
	for (int i=1;i<=q;i++){
		if (t[i][0] == 'q')
			cout<<ans[i-1]<<'\n';
	}
}

void Push(int cur, int lc, int rc, int sz){
	Sum[lc] += Lz[cur] * sz, Lz[lc] += Lz[cur];
	Sum[rc] += Lz[cur] * sz, Lz[rc] += Lz[cur];
	Lz[cur] = 0;
}


void Add(int i, int v){
	for (i += N; i; i /= 2)
		Sum[i] += v;
}

int get(int l, int r, int ans = 0){
	for (l += N - 1, r += N; l + 1 < r; l /= 2, r /= 2){
		if (!(l & 1))
			ans += Sum[l ^ 1];
		if (r & 1)
			ans += Sum[r ^ 1];
	}
	return ans;
}

signed main(){
	int n, q;
	cin>>n>>q>>s;

	for (int i=1;i<=q;i++){
		cin>>t[i]>>l[i];
		if (t[i][0] == 'q'){
			cin>>r[i];
			Sz |= r[i] - l[i];
		}
	}

	if (n <= 200 and q <= 200){
		sub1(n, q);
		return 0;
	}


	if (Sz == 1){
		sub2(n, q);
		return 0;
	}

	for (int i=0;i<n;i++){
		if (s[i] == '1')
			tgl[0].push_back(i+1);
		s[i] = '0';
	}
	for (int i=1;i<=q;i++){
		if (t[i][0] == 't')
			tgl[i].push_back(l[i]);
	}

	for (int i=1;i<=q;i++){
		if (t[i][0] != 'q')
			continue;
		L[i] = -1, R[i] = i;
		Mid[(L[i] + R[i]) / 2].push_back(i);
	}

	for (int j=0;j<20;j++){
		for (int i=0;i<N+N;i++)
			Sum[i] = Lz[i] = 0;

		string ss = '0' + s;
		for (int i=0;i<=q;i++){
			for (int k : tgl[i]){
				if (ss[k] == '1')
					Add(k, -1);
				else
					Add(k, 1);
				ss[k] ^= 1;
			}
			for (int j : Mid[i]){
				if (get(l[j], r[j]) < r[j] - l[j])
					L[j] = i;
				else
					R[j] = i;
			}

			vector<int> ().swap(Mid[i]);
		}
		for (int i=1;i<=q;i++){
			if (t[i][0] == 'q' and L[i] + 1 < R[i])
				Mid[(L[i] + R[i])/2].push_back(i);
		}
	}

	for (int i=1;i<=q;i++)
		if (t[i][0] == 'q')
			cout<<i - R[i]<<'\n';
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...