#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
using namespace std;
// using namespace __gnu_pbds;
#define pb push_back
#define ins insert
#define fi first
#define se second
#define endl "\n"
#define ALL(x) x.begin(), x.end()
#define intt long long
const intt mod = 1e9 + 7;
const intt base = 9973;
const intt inf = 1e18;
const intt mxN = 5e5 + 5;
const intt L = 21;
void solve() {
	intt N, K, R, maks = 0;
	cin >> N >> K >> R;
	vector<intt> A(N), REQ(K);
	set<intt> st;
	for(auto &a : A) cin >> a;
	for(intt i = 0; i < R; i++) {
		intt num, cnt;
		cin >> num >> cnt;
		REQ[num] = cnt;
		st.insert(num);
	}
	
	vector<vector<intt>>pos(K, vector<intt>{});
	for(intt i = 0; i < N; i++) {
		pos[A[i]].pb(i);
	}
	vector<vector<intt>>rb(K, vector<intt>{});
	
	for(intt num : st) {
		rb[num].resize(pos[num].size());
		for(intt i = 0; i < pos[num].size(); i++) {
			if(i + REQ[num] - 1 < (intt)pos[num].size()) {
				rb[num][i] = pos[num][i + REQ[num] - 1] + 1;
			} else {
				rb[num][i] = inf;
			}
		}
	}
	
	intt ans = inf;
	for(intt num : st) {
		maks = max(maks, rb[num][0]);
	}
	if(maks == inf) {
		cout << "impossible" << endl;
		return;
	}
	vector<intt> cur(K, 0ll);
	for(intt i = 0; i < N; i++) {
		ans = min(ans, maks - i);
		if(st.find(A[i]) != st.end()) {
			cur[A[i]]++;
			intt newidx = cur[A[i]];
			maks = max(maks, rb[A[i]][newidx]);
		}
	}
	cout << ans << endl;
}
signed main() {
	ios_base::sync_with_stdio(0); 
	cin.tie(NULL);                
	cout.tie(NULL);
	intt tst = 1;
	// cin >> tst;
	while(tst--) {
		solve();
	}
}
| # | 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... |