提交时间:2022-02-16 13:44:45

运行 ID: 45251

#include<bits/stdc++.h> using namespace std; const int M=1000001; set<int> s[M]; int bl[M],lazy[M],num[M]; int n,block; inline int read() //以字符串形式读入数字可提速 { int x=0,f=0; char c=getchar(); for(; c<'0' || c>'9'; c=getchar(),f=(c=='-')); for(; c<='9' && c>='0'; c=getchar()) x=(x<<3)+(x<<1)+c-'0'; //位运算优化即x*8+x*2=x*10 return f?-x:x; } int Add(int l,int r,int val) { for(int i=l; i<=min(bl[l]*block,r); i++) { s[bl[l]].erase(num[i]); num[i]+=val; s[bl[l]].insert(num[i]); } if(bl[l]!=bl[r]) for(int i=(bl[r]-1)*block+1; i<=r; i++) { s[bl[r]].erase(num[i]); num[i]+=val; s[bl[r]].insert(num[i]); } for(int i=bl[l]+1; i<=bl[r]-1; i++) lazy[i]+=val; } int Search(int l,int r,int x) { int ans=-1; for(int i=l; i<=min(bl[l]*block,r); i++) if(num[i]+lazy[bl[l]]<x) ans=max(ans,num[i]+lazy[bl[l]]); if(bl[l]!=bl[r]) { for(int i=(bl[r]-1)*block+1; i<=r; i++) if(num[i]+lazy[bl[r]]<x) ans=max(ans,num[i]+lazy[bl[r]]); } for(int i=bl[l]+1; i<=bl[r]-1; i++) { int aim=x-lazy[i]; set<int>::iterator it=s[i].lower_bound(aim); if(it==s[i].begin()) continue; --it; ans=max(ans,*it+lazy[i]); } return ans; } int main() { n=read(); block=sqrt(n); for(int i=1; i<=n; i++) { bl[i]=(i-1)/block+1; num[i]=read(); s[bl[i]].insert(num[i]); } for(int i=1,opt,l,r,x; i<=n; i++) { opt=read(),l=read(),r=read(),x=read(); if(opt==0) Add(l,r,x); if(opt==1) cout<<Search(l,r,x)<<'\n'; } }