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 <bits/stdc++.h>
using namespace std;
#define DIM 300007
#define INF 1000000007
struct Q
{
int r, a, b;
};
vector<Q> quer;
long long n, q, nom, it, flag, a, b, res;
string s[107], r;
void solve1(string st)
{
s[0]=st;
s[0]='&'+s[0];
nom=0;
for(int h=1; h<=q; h++)
{
if(quer[h].r==1) r="t";
else r="s";
if(r[0]=='t')
{
it=quer[h].a;
nom++;
s[nom]=s[nom-1];
if(s[nom][it]=='0') s[nom][it]='1';
else s[nom][it]='0';
continue;
}
a=quer[h].a;
b=quer[h].b;
res=0;
for(int k=0; k<=nom; k++)
{
flag=0;
for(int i=a; i<b; i++)
{
if(s[k][i]=='0')
{
flag=1;
break;
}
}
if(flag==0) res++;
}
nom++;
s[nom]=s[nom-1];
cout<<res<<endl;
}
return;
}
void solve2(string st)
{
string s, r;
long long a, b, it;
vector<long long> lst, ans;
lst.resize(n+7);
ans.resize(n+7);
s=st;
s='&'+s;
for(int i=1; i<=n; i++) lst[i]=0;
for(int i=1; i<=q; i++)
{
if(quer[i].r==1) r="t";
else r="s";
if(r[0]=='t')
{
it=quer[i].a;
if(s[it]=='1') ans[it]+=i-lst[it];
if(s[it]=='1') s[it]='0';
else s[it]='1';
lst[it]=i;
continue;
}
a=quer[i].a;
b=quer[i].b;
if(s[a]=='1') ans[a]+=i-lst[a];
lst[a]=i;
cout<<ans[a]<<endl;
}
return;
}
int t[4*DIM];
void BuildTree(int v, int tl, int tr, string &s)
{
if(tl==tr)
{
if(s[tl]=='1') t[v]=0;
else t[v]=INF;
return;
}
int tm=(tl+tr)>>1;
BuildTree(2*v+1, tl, tm, s);
BuildTree(2*v+2, tm+1, tr, s);
t[v]=max(t[2*v+1], t[2*v+2]);
return;
}
void update(int v, int tl, int tr, int x, int val)
{
if(x<tl || tr<x) return;
if(tl==tr)
{
t[v]=val;
return;
}
int tm=(tl+tr)>>1;
update(2*v+1, tl, tm, x, val);
update(2*v+2, tm+1, tr, x, val);
t[v]=max(t[2*v+1], t[2*v+2]);
return;
}
int get_max(int v, int tl, int tr, int L, int R)
{
if(R<tl || tr<L) return -INF;
if(L<=tl && tr<=R) return t[v];
int tm=(tl+tr)>>1;
int mx1=get_max(2*v+1, tl, tm, L, R);
int mx2=get_max(2*v+2, tm+1, tr, L, R);
return max(mx1, mx2);
}
void solve3(string st)
{
string s='&'+st;
BuildTree(0, 1, n, s);
for(int i=1; i<=q; i++)
{
if(quer[i].r==1)
{
update(0, 1, n, quer[i].a, i);
continue;
}
int a, b;
a=quer[i].a;
b=quer[i].b;
int mx=get_max(0, 1, n, a, b);
if(mx==INF) cout<<0<<endl;
cout<<i-mx<<endl;
}
}
int main()
{
cin>>n>>q;
cin>>s[0];
quer.push_back({0, 0, 0});
for(int i=1; i<=q; i++)
{
cin>>r;
if(r[0]=='t')
{
cin>>it;
quer.push_back({1, it, 0});
continue;
}
cin>>a>>b;
if(b-a!=1) flag=1;
quer.push_back({2, a, b});
}
if(n<=100 && q<=100) solve1(s[0]);
else if(flag==0) solve2(s[0]);
else solve3(s[0]);
return 0;
}
Compilation message (stderr)
street_lamps.cpp: In function 'void solve2(std::string)':
street_lamps.cpp:64:18: warning: variable 'b' set but not used [-Wunused-but-set-variable]
64 | long long a, b, it;
| ^
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:166:32: warning: narrowing conversion of 'it' from 'long long int' to 'int' [-Wnarrowing]
166 | quer.push_back({1, it, 0});
| ^~
street_lamps.cpp:171:28: warning: narrowing conversion of 'a' from 'long long int' to 'int' [-Wnarrowing]
171 | quer.push_back({2, a, b});
| ^
street_lamps.cpp:171:31: warning: narrowing conversion of 'b' from 'long long int' to 'int' [-Wnarrowing]
171 | quer.push_back({2, a, b});
| ^
# | 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... |