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>
#define x first
#define y second
#define pb push_back
#define eb emplace_back
#define all(a) (a).begin(),(a).end()
#define SZ(a) (int)(a).size()
#define FOR(i, a, b) for(int i=(a); i<=(b); ++i)
#define ROF(i, a, b) for(int i=(a); i>=(b); --i)
#define make_unique(a) sort(all((a))), (a).resize(unique(all((a)))-(a).begin())
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
typedef double DD;
typedef long double LD;
typedef pair<LL,LL> PLL;
typedef pair<DD,DD> PDD;
typedef vector<int> VI;
typedef vector<LL> VL;
const int N = 300003;
set< pair<PII, int> > segments; // (l,r), when
set< pair<PII, int> >::iterator it;
vector<int> value_fw[N], fw[N];
vector< pair<PII, int> > to_update[N];
int ans[N], current_state[N], L[N], R[N];
int n;
char s[N];
void build_fw(int i, int j){
while(i <= n){
value_fw[i].pb(-j);
i += (i&-i);
}
}
void add(int i, int j, int v){
j = -j;
while(i <= n){
int idx = upper_bound(all(value_fw[i]), j)-value_fw[i].begin();
while(idx < SZ(fw[i])){
fw[i][idx] += v;
idx += (idx&-idx);
}
i += (i&-i);
}
}
int get(int i, int j){
j = -j;
int sum = 0;
while(i > 0){
int idx = upper_bound(all(value_fw[i]), j)-value_fw[i].begin();
while(idx > 0){
sum += fw[i][idx];
idx -= (idx&-idx);
}
i -= (i&-i);
}
return sum;
}
void connect(int i, int t){
//printf("connect %d at %d\n",i,t);
current_state[i] = 1;
pair< PII, int > to_insert = { PII(i,i), t };
PII p;
int v;
if(i < n && current_state[i+1]){
it = segments.lower_bound({PII(i+1,0),0});
tie(p, v) = *it;
to_update[t].pb( {p, t-v} );
build_fw(p.x, p.y);
to_insert.x.y = p.y;
segments.erase(it);
}
if(i > 1 && current_state[i-1]){
it = segments.lower_bound({PII(i,0),0});
--it;
tie(p, v) = *it;
to_update[t].pb( {p, t-v} );
build_fw(p.x, p.y);
to_insert.x.x = p.x;
segments.erase(it);
}
segments.insert(to_insert);
}
void cut(int i, int t){
//printf("cut %d at %d\n",i,t);
current_state[i] = 0;
it = segments.lower_bound({PII(i+1,0),0});
--it;
PII p;
int v;
tie(p, v) = *it;
build_fw(p.x, p.y);
to_update[t].pb( {p, t-v} );
segments.erase(it);
if(i < n && current_state[i+1]){
segments.insert({PII(i+1,p.y),t});
}
if(i > 1 && current_state[i-1]){
segments.insert({PII(p.x,i-1),t});
}
}
char cmd[10];
void solve(){
int q;
scanf("%d %d",&n,&q);
scanf(" %s",s+1);
FOR(i, 1, n){
if(s[i] == '1') connect(i, 0);
}
FOR(i, 1, q){
int a, b;
scanf(" %s %d",cmd,&a);
if(cmd[0] == 't'){
if(current_state[a]) cut(a, i);
else connect(a, i);
}else{
scanf("%d",&b);
--b;
L[i] = a, R[i] = b;
// check if there is existing segment
it = segments.lower_bound({PII(a+1,0),0});
if(it != segments.begin()){
--it;
PII p;
int v;
tie(p, v) = *it;
if(p.x <= a && b <= p.y){
ans[i] += i-v;
}
}
}
//printf("segments: ");
//for(auto e : segments){
// printf("(%d, %d) ",e.x.x, e.x.y);
//}
//puts("");
}
// build fenwick
FOR(i, 1, n){
make_unique(value_fw[i]);
fw[i].resize(SZ(value_fw[i])+1);
}
FOR(i, 1, q){
for(auto e : to_update[i]){
add(e.x.x, e.x.y, e.y);
}
if(L[i] == 0) continue;
ans[i] += get(L[i], R[i]);
printf("%d\n",ans[i]);
}
}
int main(){
solve();
return 0;
}
/*
*
*
*
*
*
*
*
*
*
*
*/
Compilation message (stderr)
street_lamps.cpp: In function 'void solve()':
street_lamps.cpp:107:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&n,&q);
~~~~~^~~~~~~~~~~~~~~
street_lamps.cpp:108:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf(" %s",s+1);
~~~~~^~~~~~~~~~~
street_lamps.cpp:114:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf(" %s %d",cmd,&a);
~~~~~^~~~~~~~~~~~~~~~~
street_lamps.cpp:119:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&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... |