QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#425747#6102. Query on a TreeHKOI0#WA 0ms3776kbC++202.9kb2024-05-30 16:31:332024-05-30 16:31:33

Judging History

This is the latest submission verdict.

  • [2024-05-30 16:31:33]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3776kb
  • [2024-05-30 16:31:33]
  • Submitted

answer

#include <bits/stdc++.h>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()

using namespace std;
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;

struct BIT {
    int n;
    vector<vi> a;

    BIT(int n) : n(n), a(n+2, vi(10)) {}
    
    void add(int i, int j, int num) {
        for(;i<=n;i+=i&-i) a[i][j]+=num;
    }
};

void solve() {
    string s1,s2;
    cin>>s1>>s2;
    int n=sz(s1);
    vector<int> sum(10);
    for(auto c:s1) sum[c-'0']++;
    BIT bit(n);
    for(int i=1;i<=n;i++) bit.add(i,s2[i-1]-'0',1);
    int q;
    cin>>q;
    int mx=0;
    while(1<<(mx+1)<=n) mx++;
    while(q--) {
        int t;
        cin>>t;
        if(t==1) {
            int i,x;
            cin>>i>>x;
            bit.add(i,s2[i-1]-'0',-1);
            bit.add(i,x,1);
            s2[i-1]=x+'0';
        }
        else {
            int i;
            cin>>i;
            int ans=0;
            vector<int> prev(10);
            int first_bit = s2[0]-'0';
            bool ok=false;
            for(int k=first_bit+1;k<10;k++)
                if(sum[k]) ok=true;
            if(!ok) {
                cout<<"-1\n";
                continue;
            }

            for(int j=mx;j>=0;j--) {
                if(ans+(1<<j)>n) continue;
                auto cur=prev;
                for(int k=0;k<10;k++) cur[k]+=bit.a[ans+(1<<j)][k];

                auto ok = [&] {
                    for(int k=0;k<10;k++)
                        if(sum[k]<cur[k]) return false;
                    if(ans+(1<<j)==n) return true;
                    int next_bit = s2[ans+(1<<j)]-'0';
                    for(int k=next_bit+1;k<10;k++)
                        if(sum[k]-cur[k]) return true;
                    return false;
                };

                if(ok()) {
                    ans+=1<<j;
                    prev=cur;
                }
            }
            if(i<=ans) cout<<s2[i-1]<<'\n';
            else {
                auto diff=sum;
                for(int j=0;j<10;j++) diff[j]-=prev[j];
                int remain=i-ans;
                int next_bit=s2[ans]-'0';
                int fi=0;
                for(int j=next_bit+1;j<10;j++)
                    if(diff[j]) {
                        diff[j]--;
                        remain--;
                        fi=j;
                        break;
                    }
                if(remain==0) {
                    cout<<fi<<'\n';
                    continue;
                }
                for(int j=0;j<10;j++) {
                    if(remain<=diff[j]) {
                        cout<<j<<'\n';
                        break;
                    }
                    else remain-=diff[j];
                }
            }
        }
    }
}

int main() {
#ifndef LOCAL
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    int T = 1;
    // cin >> T;
    while (T--) solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3776kb

input:

7
1 2
1 3
1 5
2 7
4 6
4 7
6
1 1
2 1 2
4 1 2 3 4
5 1 2 4 6 7
6 1 2 3 4 5 6
7 1 2 3 4 5 6 7

output:


result:

wrong answer Answer contains longer sequence [length = 6], but output contains 0 elements