标签:
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define test freopen("test.txt","r",stdin) #define maxn 2000001 #define mod 10007 #define eps 1e-9 const int inf=0x3f3f3f3f; const ll infll = 0x3f3f3f3f3f3f3f3fLL; inline 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 n,q,m,block; ll a[1000001],b[1000001],pos[1000001],add[1000001]; void reset(ll x) { ll l=(x-1)*block+1,r=min(x*block,n); for(ll i=l;i<=r;i++) b[i]=a[i]; sort(b+l,b+r+1); } ll find(ll x,ll v) { ll l=(x-1)*block+1,r=min(x*block,n); ll last=r; while(l<=r) { ll mid=(l+r)>>1; if(b[mid]<v)l=mid+1; else r=mid-1; } return last-l+1; } void update(ll x,ll y,ll v) { if(pos[x]==pos[y]) { for(int i=x;i<=y;i++)a[i]=a[i]+v; } else { for(int i=x;i<=pos[x]*block;i++)a[i]=a[i]+v; for(int i=(pos[y]-1)*block+1;i<=y;i++)a[i]=a[i]+v; } reset(pos[x]);reset(pos[y]); for(int i=pos[x]+1;i<pos[y];i++) add[i]+=v; } ll query(ll x,ll y,ll v) { ll sum=0; if(pos[x]==pos[y]) { for(int i=x;i<=y;i++)if(a[i]+add[pos[i]]>=v)sum++; } else { for(int i=x;i<=pos[x]*block;i++) if(a[i]+add[pos[i]]>=v)sum++; for(int i=(pos[y]-1)*block+1;i<=y;i++) if(a[i]+add[pos[i]]>=v)sum++; } for(int i=pos[x]+1;i<pos[y];i++) sum+=find(i,v-add[i]); return sum; } int deall(int l,int r,ll c) { if(l==r) return l; int mid=(l+r)>>1; if(query(l,mid,c)-query(l,mid,c+1)>0) return deall(l,mid,c); else return deall(mid+1,r,c); } int dealr(int l,int r,ll c) { if(l==r) return l; int mid=(l+r)>>1; if(query(mid+1,r,c)-query(mid+1,r,c+1)>0) return dealr(mid+1,r,c); else return dealr(l,mid,c); } int ask(ll cc) { int aa=query(1,n,cc),bb=query(1,n,cc+1); if(aa-bb==0) return -1; if(aa-bb==1) return 0; return dealr(1,n,cc)-deall(1,n,cc); } int main() { //test; n=read(),q=read(); block=int(sqrt(n)); for(int i=1;i<=n;i++) { a[i]=read(); pos[i]=(i-1)/block+1; b[i]=a[i]; } int x,y,v; if(n%block)m=n/block+1; else m=n/block; for(int i=1;i<=m;i++)reset(i); for(int i=1;i<=q;i++) { int ch; ch=read(); if(ch==1) { x=read(),y=read(),v=read(); update(x,y,v); } else { int p; p=read(); printf("%d\n",ask(p)); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4572910.html