Submission #1210633

#TimeUsernameProblemLanguageResultExecution timeMemory
1210633Theo830 Martian DNA (BOI18_dna)C++20
100 / 100
82 ms14404 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e9+7;
const ll MOD = 998244353;
typedef pair<ll,ll> ii;
#define iii pair<ll,ii>
#define id pair<ll,vector<ll> >
#define f(i,a,b) for(ll i = a;i < b;i++)
#define pb push_back
#define vll vector<ll>
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
///I hope I will get uprating and don't make mistakes
///I will never stop programming
///sqrt(-1) Love C++
///Please don't hack me
///@TheofanisOrfanou Theo830
///Think different approaches (bs,dp,greedy,graphs,shortest paths,mst)
///Stay Calm
///Look for special cases
///Beware of overflow and array bounds
///Think the problem backwards
///Training
int main(void){
    ll n,k,r;
    cin>>n>>k>>r;
    ll arr[n];
    ll re[k] = {0};
    f(i,0,n){
        cin>>arr[i];
    }
    vector<ll>ex[k];
    f(i,0,n){
        ex[arr[i]].pb(i);
    }
    f(i,0,k){
        reverse(all(ex[i]));
    }
    f(i,0,r){
        ll b,q;
        cin>>b>>q;
        re[b] = max(re[b],q);
    }
    ll len = 0;
    f(i,0,k){
        if(ex[i].size() < re[i]){
            cout<<"impossible\n";
            return 0;
        }
        if(re[i]){
            len = max(len,ex[i][ex[i].size() - re[i]]);
        }
    }
    ll ans = len+1;
    f(i,0,n){
        ex[arr[i]].pop_back();
        if(ex[arr[i]].size() < re[arr[i]]){
            break;
        }
        if(re[arr[i]])
            len = max(len,ex[arr[i]][ex[arr[i]].size() - re[arr[i]]]);
        ans = min(ans,len - i);
    }
    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...