#include<bits/stdc++.h>
using namespace std;
#define int long long
struct inter {
    int debInter,finInter,typeInter,dateDeb;
    bool operator < (const inter& autre) const {
        if (debInter!=autre.debInter) {
            return debInter < autre.debInter;
        }
        return finInter < autre.finInter;
    }
};
struct passage {
    int debInter,finInter,duree,dateFin;
};
const int MAX_VAL=300*1000+5,INFINI=1000*1000*1000;
int nbVal,nbReq;
int etatCour[MAX_VAL];
set<inter> enCours;
vector<passage> dejaFini;
void maj(inter ancien,int nouvDate) {
    enCours.erase(ancien);
    if (nouvDate>ancien.dateDeb && ancien.typeInter==1) {
        dejaFini.push_back({ancien.debInter,ancien.finInter,nouvDate-ancien.dateDeb,nouvDate});
    }
}
void modif(int pos,int nouvDate) {
    auto it=enCours.lower_bound({pos,INFINI,0,0});
    it--;
    inter ancien=(*it);
    maj(ancien,nouvDate);
    int nouvDeb=pos,nouvFin=pos;
    if (ancien.debInter<pos) {
        enCours.insert({ancien.debInter,pos-1,ancien.typeInter,nouvDate});
    }
    else if (pos>1) {
        it=enCours.lower_bound({pos,INFINI,0,0});
        it--;
        auto preced=(*it);
        nouvDeb=preced.debInter;
        maj(preced,nouvDate);
    }
    if (ancien.finInter>pos) {
        enCours.insert({pos+1,ancien.finInter,ancien.typeInter,nouvDate});
    }
    else if (pos<nbVal) {
        it=enCours.lower_bound({pos,INFINI,0,0});
        auto suiv=(*it);
        nouvFin=suiv.finInter;
        maj(suiv,nouvDate);
    }
    enCours.insert({nouvDeb,nouvFin,1-ancien.typeInter,nouvDate});
}
 
void afficher() {
    return;
    for (inter i:enCours) {
        cout<<i.debInter<<" "<<i.finInter<<" "<<i.typeInter<<" "<<i.dateDeb<<endl;
    }
    cout<<endl;
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>nbVal>>nbReq;
    enCours.insert({1,nbVal,0,0});
    for (int i=1;i<=nbVal;i++) {
        char nouv;
        cin>>nouv;
        if (nouv=='1') {
            modif(i,0);
        }
    }
    afficher();
    for (int i=1;i<=nbReq;i++) {
        string typeOp;
        cin>>typeOp;
        if (typeOp=="query") {
            int debReq,finReq,ans=0;
            cin>>debReq>>finReq;
            finReq--;
            auto it=enCours.lower_bound({debReq,INFINI,0,0});
            it--;
            if ((*it).finInter>=finReq && (*it).typeInter==1) {
                ans+=i-(*it).dateDeb;
            }
            for (auto j:dejaFini) {
                if (j.debInter<=debReq && j.finInter>=finReq) {
                    ans+=j.duree;
                }
            }
            cout<<ans<<"\n";
        }
        else {
            int posModif;
            cin>>posModif;
            modif(posModif,i);
            afficher();
        }
    }
}
| # | 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... |