Submission #658970

#TimeUsernameProblemLanguageResultExecution timeMemory
658970MohammadAghilStreet Lamps (APIO19_street_lamps)C++17
0 / 100
24 ms23820 KiB
      #include <bits/stdc++.h>
//   #pragma GCC optimize ("Ofast,unroll-loops")
// #pragma GCC target ("avx2")
 using namespace std;
  typedef long long ll;
   typedef pair<int, int> pp;
     #define per(i,r,l) for(int i = (r); i >= (l); i--)
       #define rep(i,l,r) for(int i = (l); i < (r); i++)
          #define all(x) begin(x), end(x)
             #define sz(x) (int)(x).size()
                 #define pb push_back
                     #define ss second
                          #define ff first
                                  void err(istringstream *iss){}template<typename T,typename ...Args> void err(istringstream *iss,const T &_val, const Args&...args){string _name;*iss>>_name;if(_name.back()==',')_name.pop_back();cerr<<_name<<" = "<<_val<<", ",err(iss,args...);}
void IOS(){
     cin.tie(0) -> sync_with_stdio(0);
     #ifndef ONLINE_JUDGE
          #define er(args ...) cerr << __LINE__ << ": ", err(new istringstream(string(#args)), args), cerr << endl
          freopen("inp.txt", "r", stdin);
          freopen("out.txt", "w", stdout);
     #else
          #define er(args ...) 0
     #endif
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll mod = 1e9 + 7, maxn = 3e5 + 5, lg = 22, inf = ll(1e9) + 5;
ll pw(ll a,ll b,ll md=mod){if(!b)return 1;ll k=pw(a,b>>1ll,md);return k*k%md*(b&1ll?a:1)%md;}

vector<int> fen[maxn], srt[maxn];

void upd(int x, int y, int k){
     for(x++; x < maxn; x += x&-x){
          for(int p = lower_bound(all(srt[x]), y) - begin(srt[x]) + 1; p <= sz(fen[x]); p += p&-p) fen[x][p-1] += k;
     }
}
int get(int x, int y){
     int res = 0;
     for(x++; x; x -= x&-x){
          for(int p = lower_bound(all(srt[x]), y) - begin(srt[x]) + 1; p; p -= p&-p) res += fen[x][p-1];
     }
     return res;
}
void upd(int x1, int x2, int y1, int y2, int k){
     if(x1 <= x2 && y1 <= y2){
          upd(x1, y1, k), upd(x2 + 1, y2 + 1, k);
          upd(x1, y2 + 1, -k), upd(x2 + 1, y1, -k);
     }
}
void addf(int x, int y){
     for(x++; x < maxn; x += x&-x) srt[x].pb(y);
}

set<int> em;
void add(int p, int t){
     em.erase(p);
     auto nxt = em.upper_bound(p), prv = prev(nxt);
     upd(*prv + 1, p, p, *nxt - 1, -t);
}
void rem(int p, int t){
     auto nxt = em.upper_bound(p), prv = prev(nxt);
     upd(*prv + 1, p, p, *nxt - 1, t);
     em.insert(p);
}

bool chk(int l, int r){
     auto it = em.lower_bound(l);
     return it == end(em) || *it > r;
}
 
int main(){ IOS();
     int n, q; cin >> n >> q;
     em.insert(-1), em.insert(n);
     vector<bool> cr(n);
     rep(i,0,n){
          char c; cin >> c;
          if(c == '0') em.insert(i);
          else cr[i] = true;
     }
     vector<pp> query(q);
     rep(i,0,q){
          string t; cin >> t;
          if(t[0] == 'q'){
               int l, r; cin >> l >> r; l--, r -= 2;
               addf(l, r);
               query[i] = {l, r};
          } else{
               int l; cin >> l; l--;
               query[i] = {l, -1};
          }
     }
     rep(i,0,maxn){
          sort(all(srt[i])), srt[i].erase(unique(all(srt[i])), end(srt[i]));
          fen[i].resize(sz(srt[i]) + 1);
     }
     rep(i,0,q){
          auto[l, r] = query[i];
          if(r == -1){
               if(cr[l]) rem(l, i + 1);
               else add(l, i + 1);
               cr[l] = !cr[l];
          }else{
               cout << get(l, r) + chk(l, r)*(i + 1) << '\n';
          }
          er(i, l, r);
     }
     return 0-0;
}

Compilation message (stderr)

street_lamps.cpp: In function 'void IOS()':
street_lamps.cpp:19:18: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |           freopen("inp.txt", "r", stdin);
      |           ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:20:18: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |           freopen("out.txt", "w", stdout);
      |           ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...