Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
119136 陈家宝 数列操作2 C++ 通过 100 742 MS 2768 KB 1738 2024-01-04 13:21:42

Tests(10/10):


#include<bits/stdc++.h> using namespace std; long long v[1000009],tag[1000009]; vector<long long>a[2600]; int blo[1000009],n,blo_len; inline long long in(int ans=0,int f=0) { char c=getchar(); for(; c<'0' || c>'9'; f^=(c=='-'),c=getchar()); for(; c<='9' && c>='0'; c=getchar())ans=(ans<<3)+(ans<<1)+(c^48); return f?-ans:ans; } void reinit(int x) { a[x].clear(); for(int i=(x-1)*blo_len+1; i<=min(n,x*blo_len); i++)a[x].push_back(v[i]); sort(a[x].begin(),a[x].end()); } void change(int l,int r,int d) { for(int i=l; i<=min(blo[l]*blo_len,r); i++)v[i]+=d; reinit(blo[l]); if(blo[l]!=blo[r]){ for(int i=(blo[r]-1)*blo_len+1; i<=r; i++)v[i]+=d; reinit(blo[r]); } for(int i=blo[l]+1; i<=blo[r]-1; i++)tag[i]+=d; } long long query(int l,int r,int d) { long long ret=-0x7f7f7f7f,cur; for(int i=l; i<=min(blo[l]*blo_len,r); i++){ cur=v[i]+tag[blo[l]]; if(cur<d&&cur>ret)ret=cur; } if(blo[l]!=blo[r]) for(int i=(blo[r]-1)*blo_len+1; i<=r; i++){ cur=v[i]+tag[blo[r]]; if(cur<d&&cur>ret)ret=cur; } for(int i=blo[l]+1; i<=blo[r]-1; i++){ int x=d-tag[i],id=lower_bound(a[i].begin(),a[i].end(),x)-a[i].begin()-1; if(a[i][id]<x)ret=max(ret,a[i][id]+tag[i]); } return ret==-0x7f7f7f7f?-1:ret; } int main() { n=in(),blo_len=sqrt(n); for(int i=1; i<=n; i++)v[i]=in(); for(int i=1; i<=n; i++)blo[i]=(i-1)/blo_len+1,a[blo[i]].push_back(v[i]); for(int i=1; i<=blo[n]; i++)sort(a[i].begin(),a[i].end()); for(int i=1; i<=n; i++){ int opt=in(),l=in(),r=in(); long long d=in(); if(!opt)change(l,r,d); else printf("%lld\n",query(l,r,d)); } return 0; }


测评信息: