제출 #1328967

#제출 시각아이디문제언어결과실행 시간메모리
1328967Jawad_Akbar_JJNekameleoni (COCI15_nekameleoni)C++20
112 / 140
3095 ms14996 KiB
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;
const int N = 1<<17;
int a[N], cnt[55];
set<int> st[55];
set<pair<int, int>> rngs;
multiset<int> lnts;

int main(){
	int n, m, k;
	cin>>n>>k>>m;

	for (int i=1;i<=k;i++)
		st[i] = {0, n+1};

	for (int i=1;i<=n;i++){
		cin>>a[i];
		st[a[i]].insert(i);
	}

	for (int i=1;i<=n;i++){
		int mx = 0;
		for (int j=1;j<=k;j++)
			mx = max(mx, *st[j].upper_bound(i - 1));
		if (mx > n)
			continue;
		rngs.insert({i, mx});
		lnts.insert(mx - i + 1);
		// cout<<"Add "<<i<<" "<<mx<<endl;
	}

	while (m--){
		int t, i, v;
		cin>>t;
		if (t == 2){
			if (lnts.size() == 0)
				cout<<-1<<'\n';
			else
				cout<<*lnts.begin()<<'\n';
			continue;
		}

		cin>>i>>v;
		auto u = rngs.upper_bound({i + 1, -1});
		while (u != rngs.begin() and (*prev(u)).second >= i){
			auto [l, r] = *prev(u);
			// cout<<"discard "<<l<<" "<<r<<endl;
			lnts.erase(lnts.find(r - l + 1));
			rngs.erase({l, r});
		}

		st[a[i]].erase(i);
		st[v].insert(i);
		a[i] = v;
		vector<int> vc = {i};
		for (int j=1;j<=k;j++){
			cnt[j] = 0;
			if (j == v)
				continue;
			auto ub = st[j].upper_bound(i);
			vc.push_back(*ub);
			vc.push_back(*prev(ub));
		}

		sort(rbegin(vc), rend(vc));
		int mex = 1, lst = 0;
		for (int i : vc){
			cnt[a[i]]++;
			while (cnt[mex])
				mex++;
			while (cnt[a[vc[lst]]] > 1)
				cnt[a[vc[lst]]]--, lst++;

			if (mex == k + 1 and i != 0){
				// cout<<"Add "<<i<<" "<<vc[lst]<<endl;
				rngs.insert({i, vc[lst]}), lnts.insert(vc[lst] - i + 1);
			}
		}

		// cout<<" print    /////////////////////////////\n";
		// for (int j=1;j<=k;j++){
		// 	cout<<j<<" :: ";
		// 	for (int jj : st[j])
		// 		cout<<jj<<' ';
		// 	cout<<'\n';
		// }
		// cout<<"///////////////////////////////////////\n\n\n"<<endl;
	}

}
#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...