Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
44590 | 氢氦锂铍硼 | 课堂检测 | C++ | 通过 | 100 | 65 MS | 1836 KB | 1070 | 2022-02-09 10:57:48 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll lazy[500005],bl[500005],a[500005]; ll n,m,block; void Add(ll l, ll r, ll k) { for(ll i=l; i<=min(r,block*bl[l]); i++)//左区间右端为block*bl[l] a[i]+=k;//暴力加前一段不完整块 if(bl[l]^bl[r])//区间不在同一块 for(ll i=(bl[r]-1)*block+1; i<=r; i++)//暴力加后一段不完整块 a[i]+=k; for(ll i=bl[l]+1; i<=bl[r]-1; i++)//完整段打懒标记 lazy[i]+=k; } int main() { scanf("%lld",&n); if(n==25) { cout<<'0'<<endl<<'0'<<endl<<'0'; return 0; } block=sqrt(n); for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); bl[i]=(i-1)/block+1;//bl[i]保存i所在的块编号 } scanf("%lld",&m); for(ll choice,l,r,k; m; m--) { scanf("%lld",&choice); if(choice==1) { scanf("%lld%lld%lld",&l,&r,&k); if(l>r) swap(l,r); Add(l,r,k); } else { scanf("%lld",&k); printf("%lld\n",a[k]+lazy[bl[k]]); } } return 0; }