|
- 利用set,只是关心相对大小,于是相同的元素自然可以只保留一个,还能保证有序,其他操作类似
-
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define maxn 123456 int n,op,l,r,c,tag; int top,a[maxn],b[maxn]; set<int>hk[maxn]; void init(int x) { hk[x].clear(); for(int i=x*tag; i<(x+1)*tag; i++) hk[x].insert(a[i]); } void updata(int l,int r,int ad) { int i; for(i=l; i%tag&&i<=r; i++)a[i]+=ad; init((i!=0&&i%tag==0)?i/tag-1:i/tag); for(; i+tag-1<=r; i+=tag)b[i/tag]+=ad; for(; i<=r; i++)a[i]+=ad; init(i/tag); } int query(int l,int r,int ad) { int i,ans=-1; for(i=l;i%tag&&i<=r;i++) if(a[i]+b[i/tag]>ans&&a[i]+b[i/tag]<ad) ans=a[i]+b[i/tag]; for(; i+tag-1<=r; i+=tag) { int temp=ad-b[i/tag]; set<int>::iterator it=hk[i/tag].lower_bound(temp); if(it!=hk[i/tag].begin()) { it--; ans=max(ans,*it+b[i/tag]); } } for(; i<=r; i++) if(a[i]+b[i/tag]>ans&&a[i]+b[i/tag]<ad) ans=a[i]+b[i/tag]; return ans; } int main() { scanf("%d",&n); tag=sqrt(n); for(int i=0; i<n; i++) { scanf("%d",&a[i]); hk[i/tag].insert(a[i]); } for(int i=0; i<n; i++) { scanf("%d%d%d%d",&op,&l,&r,&c); if(op==0)updata(l-1,r-1,c); else printf("%d\n",query(l-1,r-1,c)); } return 0; }