제출 #659003

#제출 시각아이디문제언어결과실행 시간메모리
659003MohammadAghil가로등 (APIO19_street_lamps)C++17
0 / 100
410 ms37388 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<ll> 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;
     }
}
ll get(int x, int y){
     ll 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){
     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]));
     }
     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';
          }
     }
     return 0-0;
}
#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...