记录编号 |
406747 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
数列操作B |
最终得分 |
100 |
用户昵称 |
JustWB |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
4.135 s |
提交时间 |
2017-05-19 20:39:44 |
内存使用 |
14.04 MiB |
显示代码纯文本
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<vector>
- using namespace std;
- struct stree
- {
- int l,r;
- int ls,rs;
- int sum,lazy;
- stree(){l=0,r=0,ls=-1,rs=-1,sum=0,lazy=0;}
- };
- int n,m,maxn;
- int N[100001];
- char oprt[10];
- vector<stree> tree;
- int build(int l,int r)
- {
- stree temp;
- int now=maxn++;
- tree.push_back(temp);
- tree[now].l=l;tree[now].r=r;
- if(l==r)
- {
- tree[now].sum=N[l];
- return now;
- }
- int ls,rs,mid=(l+r)>>1;
- ls=build(l,mid);
- rs=build(mid+1,r);
- tree[now].ls=ls;tree[now].rs=rs;
- return now;
- }
- inline void update(int now,int num)
- {
- if(tree[now].l==tree[now].r)
- {
- tree[now].sum+=num;
- tree[now].lazy=0;
- return;
- }
- tree[tree[now].ls].lazy+=num;
- tree[tree[now].rs].lazy+=num;
- tree[now].lazy=0;
- }
- void add(int l,int r,int num,int now)
- {
- if(tree[now].lazy!=0)update(now,tree[now].lazy);
- if(tree[now].l==l&&tree[now].r==r)
- {
- tree[now].lazy+=num;
- return;
- }
- int mid=tree[tree[now].ls].r;
- if(r<=mid)add(l,r,num,tree[now].ls);
- else if(l>mid)add(l,r,num,tree[now].rs);
- else
- {
- add(l,mid,num,tree[now].ls);
- add(mid+1,r,num,tree[now].rs);
- }
- }
- int Q(int now,int s)
- {
- if(tree[now].lazy!=0)update(now,tree[now].lazy);
- if(tree[now].l==tree[now].r)return tree[now].sum;
- int mid=tree[tree[now].ls].r;
- if(s<=mid)return Q(tree[now].ls,s);
- else return Q(tree[now].rs,s);
- }
- int main()
- {
- freopen("shulieb.in","r",stdin);
- freopen("shulieb.out","w",stdout);
- scanf("%d",&n);
- for(int i=1;i<=n;i++)scanf("%d",&N[i]);
- build(1,n);
- scanf("%d",&m);
- for(int i=1;i<=m;i++)
- {
- cin>>oprt;
- if(oprt[0]=='A')
- {
- int a,b,c;
- scanf("%d%d%d",&a,&b,&c);
- add(a,b,c,0);
- }
- else
- {
- int s;
- scanf("%d",&s);
- printf("%d\n",Q(0,s));
- }
- }
- return 0;
- }