/*
"care a facut teste cu Lattice reduction attack e ciudat"
"linistiti va putin"
- 2023 -
*/
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
using namespace std;
struct event
{
int x;
int y;
int moment;
};
int mom,n;
bool state[300005];
bool initialstate[300005];
bool type[300005];
int l[300005];
int r[300005];
int pos[300005];
int altaib[300005];
vector<event> updates;
vector<int> vals[300005];
vector<int> aib[300005];
void altupdate(int index, int delta)
{
while (index<=n)
{
altaib[index]+=delta;
index+=index&(-index);
}
}
int altquery(int index)
{
int ans;
ans=0;
while (index>0)
{
ans+=altaib[index];
index-=index&(-index);
}
return ans;
}
void setupdate(int x, int y)
{
for (; x<=n; x+=x&(-x))
{
vals[x].push_back(y);
}
}
void updatinho(int apos)
{
int st,dr;
st=apos-1;
while (st>0 && state[st]==1)
{
st--;
}
st++;
dr=apos+1;
while (dr<n+1 && state[dr]==1)
{
dr++;
}
dr--;
setupdate(st,apos);
updates.push_back({st,apos,mom});
setupdate(apos+1,apos);
updates.push_back({apos+1,apos,mom});
setupdate(st,dr+1);
updates.push_back({st,dr+1,mom});
setupdate(apos+1,dr+1);
updates.push_back({apos+1,dr+1,mom});
}
int indice(int x, int y)
{
return upper_bound(vals[x].begin(),vals[x].end(),y)-vals[x].begin()-1;
}
void update(int x, int y, int delta)
{
int newy;
for (; x<=n; x+=x&(-x))
{
newy=indice(x,y);
for (; newy<=aib[x].size(); newy+=newy&(-newy))
{
aib[x][newy]+=delta;
}
}
}
int query(int x, int y)
{
int ans,newy;
ans=0;
for (; x>0; x-=x&(-x))
{
newy=indice(x,y);
for (; newy>0; newy-=newy&(-newy))
{
ans+=aib[x][newy];
}
}
return ans;
}
signed main()
{
ifstream fin("secvp.in");
ofstream fout("secvp.out");
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long q,i,j,cnt;
char ch;
string s;
cin >> n >> q;
for (i=1; i<=n; i++)
{
cin >> ch;
if (ch=='0')
state[i]=0;
else
state[i]=1;
if (state[i]==1)
altupdate(i,1);
initialstate[i]=state[i];
}
for (i=1; i<=q; i++)
{
cin >> s;
if (s=="query")
type[i]=1;
else
type[i]=0;
if (type[i]==1)
{
cin >> l[i] >> r[i];
}
else
{
cin >> pos[i];
mom=i;
updatinho(pos[i]);
state[pos[i]]=1-state[pos[i]];
}
}
for (i=1; i<=n+1; i++)
{
vals[i].push_back(0);
sort(vals[i].begin(),vals[i].end());
aib[i].resize(vals[i].size());
state[i]=initialstate[i];
}
cnt=0;
for (i=1; i<=q; i++)
{
if (type[i]==1)
{
if (query(l[i],r[i]-1)!=0)
cout << i+query(l[i],r[i]-1) << "\n";
else
{
if (altquery(r[i]-1)-altquery(l[i]-1)==(r[i]-l[i]))
cout << i << "\n";
else
cout << 0 << "\n";
}
}
else
{
if (state[pos[i]]==1)
{
update(updates[cnt].x,updates[cnt].y,updates[cnt].moment);
cnt++;
update(updates[cnt].x,updates[cnt].y,-updates[cnt].moment);
cnt++;
update(updates[cnt].x,updates[cnt].y,-updates[cnt].moment);
cnt++;
update(updates[cnt].x,updates[cnt].y,updates[cnt].moment);
cnt++;
altupdate(pos[i],-1);
}
else
{
update(updates[cnt].x,updates[cnt].y,-updates[cnt].moment);
cnt++;
update(updates[cnt].x,updates[cnt].y,updates[cnt].moment);
cnt++;
update(updates[cnt].x,updates[cnt].y,updates[cnt].moment);
cnt++;
update(updates[cnt].x,updates[cnt].y,-updates[cnt].moment);
cnt++;
altupdate(pos[i],1);
}
state[pos[i]]=1-state[pos[i]];
}
}
}
Compilation message
street_lamps.cpp: In function 'void update(int, int, int)':
street_lamps.cpp:97:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
97 | for (; newy<=aib[x].size(); newy+=newy&(-newy))
| ~~~~^~~~~~~~~~~~~~~
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:126:19: warning: unused variable 'j' [-Wunused-variable]
126 | long long q,i,j,cnt;
| ^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4 ms |
19036 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
543 ms |
50220 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
19292 KB |
Output is correct |
2 |
Correct |
6 ms |
19288 KB |
Output is correct |
3 |
Correct |
6 ms |
19292 KB |
Output is correct |
4 |
Correct |
4 ms |
19036 KB |
Output is correct |
5 |
Correct |
2586 ms |
149044 KB |
Output is correct |
6 |
Correct |
1960 ms |
123632 KB |
Output is correct |
7 |
Correct |
1220 ms |
85236 KB |
Output is correct |
8 |
Correct |
191 ms |
44116 KB |
Output is correct |
9 |
Correct |
76 ms |
21920 KB |
Output is correct |
10 |
Correct |
77 ms |
21844 KB |
Output is correct |
11 |
Correct |
73 ms |
22096 KB |
Output is correct |
12 |
Correct |
201 ms |
42688 KB |
Output is correct |
13 |
Correct |
185 ms |
44088 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
4 ms |
19040 KB |
Output is correct |
2 |
Incorrect |
5 ms |
19288 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4 ms |
19036 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |