This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct seg{
struct node{
int l,r;
int val;
};
vector<node> tree;
void init(){
tree.push_back({0,0,0});
tree.push_back({0,0,0});
}
void insert(int n,int s,int e,int t,int diff){
tree[n].val+=diff;
int mid=s+e>>1;
if(diff<=mid){
if(!tree[n].l){
tree[n].l=tree.size();
tree.push_back({0,0,diff});
return;
}insert(tree[n].l,s,mid,t,diff);
}else{
if(!tree[n].r){
tree[n].r=tree.size();
tree.push_back({0,0,diff});
return;
}insert(tree[n].r,mid+1,e,t,diff);
}
}
int query(int n,int s,int e,int l,int r){
if(!n||!tree[n].val||e<l||r<s)return 0;
int mid=s+e>>1;
return query(tree[n].l,s,mid,l,r)+query(tree[n].r,mid+1,e,l,r);
}
};
seg tree[1048564];
int N;
void update(int n,int s,int e,int t,int k,int diff){
if(e<t||t<s)return;
tree[n].insert(1,1,N,k,diff);
if(s==e)return;
int mid=s+e>>1;
update(n<<1,s,mid,t,k,diff);
update(n<<1|1,mid+1,e,t,k,diff);
}
int query(int n,int s,int e,int l,int r,int ll,int rr){
if(e<l||r<s)return 0;
if(l<=s&&e<=r){
int t=tree[n].query(1,1,N,ll,rr);
return t;
}
int mid=s+e>>1;
return query(n<<1,s,mid,l,r,ll,rr)+query(n<<1|1,mid+1,e,l,r,ll,rr);
}map<int,pair<int,int>> t;
string arr;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,q,b,c;
cin>>n>>q>>arr;N=n;
for(int i=1;i<1048564;i++)tree[i].init();
arr='0'+arr+'0';
int w=0;
for(int i=1;i<arr.length();i++){
if(arr[i-1]=='1'&&arr[i]=='0'){
t.insert({w,{i-1,0}});
}if(arr[i-1]=='0'&&arr[i])w=i;
}
string a;
for(int i=1;i<=q;i++){
cin>>a>>b;
if(a[0]=='q'){
cin>>c;c--;
int res=0;
auto e=t.upper_bound(b);
if(e!=t.begin()&&c<=prev(e)->second.first)res+=i-prev(e)->second.second;
res+=query(1,1,n,1,b,c,n);
cout<<res<<'\n';
}else{
if(arr[b]=='1'){
auto e=prev(t.upper_bound(b));
update(1,1,n,e->first,e->second.first,i-e->second.second);
if(e->first!=b){
t.insert({e->first,{b-1,i}});
}if(e->second.first!=b){
t.insert({b+1,{e->second.first,i}});
}t.erase(e);arr[b]='0';
}else{
if(arr[b-1]=='1'&&arr[b+1]=='1'){
auto e=t.lower_bound(b);
update(1,1,n,e->first,e->second.first,i-e->second.second);
int E=e->second.first;
auto e2=prev(e);
update(1,1,n,e2->first,e2->second.first,i-e2->second.second);
int S=e2->first;
t.erase(e);t.erase(e2);
t.insert({S,{E,i}});
}else if(arr[b-1]=='1'){
auto e2=prev(t.lower_bound(b));
update(1,1,n,e2->first,e2->second.first,i-e2->second.second);
int S=e2->first;
t.erase(e2);
t.insert({S,{b,i}});
}else if(arr[b+1]=='1'){
auto e=t.lower_bound(b);
update(1,1,n,e->first,e->second.first,i-e->second.second);
int E=e->second.first;
t.erase(e);
t.insert({b,{E,i}});
}else{
t.insert({b,{b,i}});
}arr[b]='1';
}
}
}
}
Compilation message (stderr)
street_lamps.cpp: In member function 'void seg::insert(int, int, int, int, int)':
street_lamps.cpp:18:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
18 | int mid=s+e>>1;
| ~^~
street_lamps.cpp: In member function 'int seg::query(int, int, int, int, int)':
street_lamps.cpp:35:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
35 | int mid=s+e>>1;
| ~^~
street_lamps.cpp: In function 'void update(int, int, int, int, int, int)':
street_lamps.cpp:45:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
45 | int mid=s+e>>1;
| ~^~
street_lamps.cpp: In function 'int query(int, int, int, int, int, int, int)':
street_lamps.cpp:55:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
55 | int mid=s+e>>1;
| ~^~
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:68:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
68 | for(int i=1;i<arr.length();i++){
| ~^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |