#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define vec(...) vector<__VA_ARGS__>
#define _3Pxrs5V ios::sync_with_stdio(0),cin.tie(0)
typedef long long ll;
using pii=pair<int,int>;
using vi=vector<int>;
void print(){cout<<'\n';}
template<class h,class...t>
void print(const h&v,const t&...u){cout<<v<<' ',print(u...);}
//e
const int inf=200011;
const int _n=340002;
const int _k=51;
struct node{
int res;
int l[_k+1],r[_k+1];
};
node seg[_n];
int k; // initial k
void update_node(int &node,int val,int t=0){
if(val==-1){
return;
}
if(node==-1){
node=val;
}else{
if(t==0){
node=min(node,val);
}else{
node=max(node,val);
}
}
}
void update(int node,int l,int r,int pos,int v){
if(l==r-1){
rep(i,k){
seg[node].l[i]=-1;
seg[node].r[i]=-1;
}
seg[node].l[v]=seg[node].r[v]=l;
seg[node].res=inf;
return;
}
int m=(l+r)>>1;
if(pos<m){
update(node*2,l,m,pos,v);
}else{
update(node*2+1,m,r,pos,v);
}
seg[node].res=inf;
seg[node].res=min(seg[node*2].res,seg[node*2+1].res);
vec(pii) evs;
rep(i,k){
int l=seg[node*2].r[i];
int r=seg[node*2+1].l[i];
l=(l!=-1?l:-inf);
r=(r!=-1?r:inf);
// if(node==1){
// print(l,r);
// }
evs.emplace_back(r,l);
int v0l=seg[node*2].l[i];
int v0r=seg[node*2].r[i];
int v1l=seg[node*2+1].l[i];
int v1r=seg[node*2+1].r[i];
seg[node].l[i]=seg[node].r[i]=-1;
update_node(seg[node].l[i],v0l);
update_node(seg[node].l[i],v0r);
update_node(seg[node].l[i],v1l);
update_node(seg[node].l[i],v1r);
update_node(seg[node].r[i],v0l,1);
update_node(seg[node].r[i],v0r,1);
update_node(seg[node].r[i],v1l,1);
update_node(seg[node].r[i],v1r,1);
}
// print("\n.....");
sort(evs.begin(), evs.end());
int mi=inf;
per(i,sz(evs)){
if(mi==-inf){
break;
}
if(evs[i].fi!=inf and mi!=inf){
// if(node==1){
// print(evs[i].fi,mi);
// }
seg[node].res=min(seg[node].res,evs[i].fi-mi+1);
}
mi=min(mi,evs[i].se);
// print(evs[i].se);
}
}
signed main(){
_3Pxrs5V;
int n,q;
cin>>n>>k>>q;
rep(i,n){
int v;
cin>>v;
v-=1;
update(1,0,n,i,v);
}
rep(_,q){
int t;
cin>>t;
if(t==1){
int i,v;
cin>>i>>v;
i-=1,v-=1;
// print(i,v);
update(1,0,n,i,v);
}else{
if(k==1){
cout<<"1\n";
}else{
int res=seg[1].res;
cout<<(res>n?-1:res)<<"\n";
// cout<<seg[1].res<<"\n";/
}
}
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
35 ms |
3660 KB |
Output is correct |
2 |
Correct |
31 ms |
3584 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
87 ms |
4676 KB |
Output is correct |
2 |
Correct |
89 ms |
4668 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
162 ms |
6852 KB |
Output is correct |
2 |
Correct |
179 ms |
6852 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1156 ms |
27352 KB |
Output is correct |
2 |
Execution timed out |
3088 ms |
77460 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2259 ms |
54180 KB |
Output is correct |
2 |
Execution timed out |
3073 ms |
108100 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2406 ms |
54524 KB |
Output is correct |
2 |
Execution timed out |
3050 ms |
107076 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3081 ms |
54272 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3087 ms |
54428 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3090 ms |
108208 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3087 ms |
108300 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |