**【题目大意】
就是找一个最短连续子序列,使得对于每个i,min[i]<=sum(i)<=max[i]**
这题还有别的写法;这只是别人的一种
注意这个判断合不合法不要又重复判断。。。
一开始逗比了,还打算重复判断那样坑定会超时。。
用个头尾指针更清晰
这里的p就是头指针,i是尾指针。。
int a[N],L[N],R[N];
int cnt[N];
void solve(){
int p=1;
int ans=-1;
for(int i=1;i<=n;++i){
int x=a[i];
cnt[x]++;
if(cnt[x]==L[x])legal++;
if(cnt[x]==R[x]+1){
for(int j=p;;++j){
cnt[a[j]]--;
if(cnt[a[j]]==L[a[j]]-1)legal--;
if(a[j]==x){
p=j+1;break;
}
}
}
for(int j=p;;j++){
if(cnt[a[j]]>L[a[j]])cnt[a[j]]--;
else{
p=j;break;
}
}
if(legal==k){
int len=i-p+1;
if(ans<0||ans>len)ans=len;
}
}
pf("%d\n",ans);
}
int main(){
while(~sf("%d%d",&n,&k)){
legal=0;
rep(i,1,n)sf("%d",&a[i]);
rep(i,1,k){ sf("%d%d",&L[i],&R[i]);if(L[i]<=0&&R[i]>=0)legal++; }
solve();
}
}