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 ll long long
#define ff first
#define ss second
#define pb push_back
using namespace std;
string a, b, c, x;
vector<string>strings;
set<string>st;
ll n, q;
struct crossing
{
    int dd, ht, mid;
    char toProp;
    bool faltaprop;
    bool allJ, allO, allI, iscorrect;
    crossing *L, *R;
    crossing(){}
    crossing(int l, int r){
        dd = l, ht = r;
        mid = (dd+ht)/2;
        if(l!=r){
            L = new crossing(l, mid);
            R = new crossing(mid+1, r);
            allJ = L->allJ && R->allJ;
            allO = L->allO && R->allO;
            allI = L->allI && R->allI;
            iscorrect = L->iscorrect && R->iscorrect;
        }else{
            allJ = a[dd] == 'J';
            allO = a[dd] == 'O';
            allI = a[dd] == 'I';
            if(a[dd]==x[dd])iscorrect = true;
        }
    }
    void propagate(){
        if(!faltaprop)return;
        L->insert(dd, mid, toProp);
        R->insert(mid+1, ht, toProp);
        iscorrect = L->iscorrect && R->iscorrect;
        faltaprop=false;
    }
    void insert(int l, int r, char cual){
       // cout << dd << " " << ht << " " << l << " " << r << endl;
        if(dd == l && r==ht ){
            if(cual == 'J' && allJ)iscorrect = true;
            else if(cual == 'O'&&allO)iscorrect=true;
            else if(cual == 'I' && allI)iscorrect = true;
            else iscorrect=false;
            //no hace falta propagar lo que hay aca
            toProp = cual;
            faltaprop = true;
            return ;
        }
        propagate();
        if(r<=mid)L->insert(l, r, cual);
        else if(mid<l)R->insert(l, r, cual);
        else {
            L->insert(l, mid, cual);
            R->insert(mid+1, r, cual);
        }
        iscorrect = L->iscorrect && R->iscorrect;
    }
};
bool join(int a, int b){
    string nueva="";
    //cout << a << " " << b << endl;
    for(int i = 0 ; i < n ; i++){
        if(strings[a][i]==strings[b][i]){
            nueva+=strings[a][i];
        }else {
            if((strings[a][i]=='J' && strings[b][i]=='O' )|| (strings[b][i]=='J' && strings[a][i]=='O'))nueva+="I";
            else if((strings[a][i]=='I' && strings[b][i]=='O') || (strings[b][i]=='I' && strings[a][i]=='O'))nueva+="J";
            else if((strings[a][i]=='I' && strings[b][i]=='J') || (strings[b][i]=='I' && strings[a][i]=='J'))nueva+="O";
        }
    }
    if(st.find(nueva)==st.end()){
        //cout << nueva << endl;
        st.insert(nueva);
        strings.pb(nueva);
    }else{
        return false;
    }
    return true;
}
void calculateString(){
    bool ans = true;
    while(ans){
        ans = false;
        int gen = strings.size();
        for(int i = 0 ; i < gen-1; i++){
            for(int j = i+1 ; j < gen ; j++){
                if(join(i, j))ans = true;
            }
        }
    }
}
void querys(){
    cin>>q;
    cin>>x;
    if(st.find(x)!=st.end())cout<<"Yes\n";
    else cout << "No\n";
    int l, r;
    char c;
    for(int i = 0 ;i  < q ; i++){
        cin>>l>>r>>c;
        for(int i = l-1 ; i <= r-1 ; i++){
            x[i]=c;
        }
        //cout << "ask "<<x<<endl;
        if(st.find(x)!=st.end())cout<<"Yes\n";
        else cout << "No\n";
    }
}
crossing *seg;
bool askforX(){
    seg = new crossing(0, n-1);
    return seg->iscorrect;
}
void input(){
    //cin.tie(0);
    //cout.tie(0);
    //ios_base::sync_with_stdio(false);
    cin>>n;
    cin>>a>>b>>c;
    strings.pb(a);
    strings.pb(b);
    strings.pb(c);
    st.insert(a);
    st.insert(b);
    st.insert(c);
    if(st.size()>=2){
        calculateString();
        querys();
    }else{
    cin>>q;
    cin>>x;
    if(askforX())cout << "Yes" << endl;
    else cout << "No" << endl;
    ll l, r;
    char value;
    for(int i = 0 ; i < q ; i++){
        cin>>l>>r>>value;
        seg->insert(l-1, r-1, value);
        if(seg->iscorrect)cout<<"Yes" << endl;
        else cout << "No" << endl;
    }
    }
}
int main(){
    input();
}
| # | 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... |