1 条题解
-
0
C++ :
#include <cstdio> #include <cctype> #include <cstring> #define repu(i,x,y) for (int i=x; i<=y; ++i) #define lc x<<1 #define rc x<<1|1 #define mid ((l+r)>>1) using namespace std; int n,m,tot[524288],a[524288][20],ql,qr,w,ans; int s[200100]; int getint() { char ch; while (!isdigit(ch=getchar()) && ch!='-'); bool flag=ch=='-'; if (flag) ch=getchar(); int x=ch-'0'; for (; isdigit(ch=getchar()); x=x*10+ch-'0'); return flag?-x:x; } int cmp(int x,int y,int len) { repu(i,0,len-1) { if (s[x+i]<s[y+i]) return -1; if (s[x+i]>s[y+i]) return 1; } return 0; } void update(int x,int l,int r) { tot[x]=tot[rc],memcpy(a[x],a[rc],sizeof(a[x])); repu(i,1,tot[lc]) while (1) { int u=a[lc][i],v=a[x][tot[x]],t=cmp(u,v,r-v+1); if (t==1) break; if (!t) { if (2*(r-v+1)>r-u+1) --tot[x]; a[x][++tot[x]]=u; break; } if (!--tot[x]) { a[x][++tot[x]]=u; break; } } } void build(int x,int l,int r) { if (l==r) { a[x][tot[x]=1]=l; return; } build(lc,l,mid),build(rc,mid+1,r); update(x,l,r); } void query(int x,int l,int r) { if (ql<=l && qr>=r) { repu(i,1,tot[x]) if (cmp(a[x][i],ans,qr-ans+1)==-1) ans=a[x][i]; return; } if (qr>mid) query(rc,mid+1,r); if (ql<=mid) query(lc,l,mid); } void modify(int x,int l,int r) { if (ql<=l && qr>=r) return; if (ql<=mid) modify(lc,l,mid); if (qr>mid) modify(rc,mid+1,r); update(x,l,r); } int main() { scanf("%d%d",&n,&m); repu(i,1,n) s[i]=getint(); build(1,1,n); while (m--) if (getint()==1) { ql=getint(),qr=getint(),w=getint(); repu(i,ql,qr) s[i]+=w; modify(1,1,n); } else { ql=getint(),qr=ans=getint(); query(1,1,n),printf("%d\n",ans); } return 0; }
- 1
信息
- ID
- 941
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者