E. GukiZ and GukiZiana
http://codeforces.com/contest/551/problem/E
分块入门题.......
#include <bits/stdc++.h>
#define N 500005
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll a[N],flag[1005];int p[N];
int n,q,size;
vector<pair<ll,int> >vec[1005];
void push(int x){
if(flag[x]==0) return ;
for(int i=(x-1)*size+1;i<=min(n,size*x);i++) a[i]+=flag[x];
flag[x]=0;
}
void add(int l,int r,ll vul){
push(p[l]);
for(int i=l;i<=min(r,size*p[l]);i++) a[i]+=vul;
vec[p[l]].clear();
for(int i=(p[l]-1)*size+1;i<=min(n,size*p[l]);i++) vec[p[l]].push_back(make_pair(a[i],i));
sort(vec[p[l]].begin(),vec[p[l]].end());
if(p[l]!=p[r]){
push(p[r]);
for(int i=(p[r]-1)*size+1;i<=r;i++) a[i]+=vul;
vec[p[r]].clear();
for(int i=(p[r]-1)*size+1;i<=min(n,size*p[r]);i++) vec[p[r]].push_back(make_pair(a[i],i));
sort(vec[p[r]].begin(),vec[p[r]].end());
}
for(int i=p[l]+1;i<=p[r]-1;i++) flag[i]+=vul;
}
int querty(ll x){
int mx=-1*INF;int mn=INF;
for(int i=1;i<=p[n];i++){
int l=1;int r=vec[i].size();int ans=0;
ll xx=x-flag[i];
while(l<=r){
int mid=(l+r)>>1;
if(vec[i][mid-1].first>=xx){
ans=mid;r=mid-1;
}
else l=mid+1;
}
if(ans==0||vec[i][ans-1].first!=xx) continue;
mn=min(mn,vec[i][ans-1].second);
l=1;r=vec[i].size();
while(l<=r){
int mid=(l+r)>>1;
if(vec[i][mid-1].first<=xx){
ans=mid;l=mid+1;
}
else r=mid-1;
}
mx=max(mx,vec[i][ans-1].second);
}
if(mn==INF) return -1;
return mx-mn;
}
int main(){
ios::sync_with_stdio(false);
n=read();q=read();size=(int)sqrt(n);
for(int i=1;i<=n;i++){
a[i]=read();p[i]=(i-1)/size+1;
vec[(i-1)/size+1].push_back(make_pair(a[i],i));
}
for(int i=1;i<=p[n];i++) sort(vec[i].begin(),vec[i].end());
int op,l,r;ll vul;
for(int i=1;i<=q;i++){
op=read();
if(op==1){
l=read();r=read();vul=read();
add(l,r,vul);
}
else{
vul=read();
printf("%d\n",querty(vul));
}
}
return 0;
}

浙公网安备 33010602011771号