Submission #1212787

#TimeUsernameProblemLanguageResultExecution timeMemory
1212787vincentbucourt1Grudanje (COCI19_grudanje)C++20
70 / 70
474 ms114760 KiB
#include <bits/stdc++.h>
using namespace std;
void fastIO(){ios_base::sync_with_stdio(false),cin.tie(0);}
#define int long long
#define f first
#define s second

const int INF = (int)1e18;

int N, Q;
vector<int> word;
vector<int> whenCovered;
vector<pair<int,int>> queries;
int ans = 0;

struct Segtree {
    int numleaves;
    vector<pair<int,int>> tree;
    Segtree (int n) {
        numleaves = 1;
        while (numleaves < n) numleaves *= 2;
        tree.assign(2*numleaves, {-INF, -INF});
    }
    pair<int,int> combine (pair<int,int> a, pair<int,int> b) {
        if (a < b) {
            swap(a, b);
        }
        if (b.f > a.s) {
            a.s = b.f;
        }
        else if (b.s > a.s) {
            a.s = b.s;
        }
        return a;
    }
    pair<int,int> query (int l, int r) {
        pair<int,int> res = {-INF, -INF};
        l += numleaves, r += numleaves+1;
        while (l < r) {
            if (l&1) {
                res = combine(res, tree[l++]);
            }
            if (r&1) {
                res = combine(res, tree[--r]);
            }
            l /= 2, r /= 2;
        }
        return res;
    }
    void update (int idx, int val) {
        idx += numleaves;
        tree[idx] = {val, -INF};
        idx /= 2;
        while (idx > 0) {
            tree[idx] = combine(tree[2*idx], tree[2*idx+1]);
            idx /= 2;
        }
    }
};

signed main() {
    fastIO();
    string line;
    getline(cin, line);
    word.resize((int)line.size());
    for (int i = 0; i < (int)line.size(); i++) {
        word[i] = line[i] - 'a';
    }
    N = (int)word.size();
    cin >> Q;
    queries.resize(Q);
    for (int iq = 0; iq < Q; iq++) {
        cin >> queries[iq].f >> queries[iq].s;
        queries[iq].f--, queries[iq].s--;
    }
    whenCovered.resize(N);
    for (int i = 0; i < N; i++) {
        int p;
        cin >> p;
        p--;
        whenCovered[p] = i+1;
    }

    vector<Segtree> segQ(26, Segtree(N));
    for (int i = 0; i < N; i++) {
        segQ[word[i]].update(i, whenCovered[i]);
    }
    for (int iq = 0; iq < Q; iq++) {
        for (int letter = 0; letter < 26; letter++) {
            // assert((int)segQ[letter].tree.size() == 2*Segtree(N).numleaves);
            ans = max(ans, segQ[letter].query(queries[iq].f, queries[iq].s).s);
        }
    }
    cout << ans << "\n";
}
#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...
#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...