比赛 |
EYOI暨SBOI暑假快乐赛3rd |
评测结果 |
AAAAAAAAAA |
题目名称 |
移动电话 |
最终得分 |
100 |
用户昵称 |
ZRQ |
运行时间 |
0.117 s |
代码语言 |
C++ |
内存使用 |
41.95 MiB |
提交时间 |
2022-06-27 11:33:56 |
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int S=2050;
struct node
{
int l,r,a[S];
}t[4*S];
int s,op,x,y,a,l,r;
void add(int rt,int i,int k)
{
while(i<=s) t[rt].a[i]+=k,i+=i&-i;
return ;
}
int ask(int rt,int x)
{
int res=0;
while(x) res+=t[rt].a[x],x-=x&-x;
return res;
}
void build(int rt,int l,int r)
{
t[rt].l=l,t[rt].r=r;
if(l==r) return;
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
return ;
}
void updata(int rt,int x,int y,int k)
{
if(t[rt].l<=x&&t[rt].r>=x) add(rt,y,k);
if(t[rt].l==t[rt].r) return ;
int mid=(t[rt].l+t[rt].r)>>1;
if(x<=mid) updata(rt<<1,x,y,k);
else if(x>mid) updata(rt<<1|1,x,y,k);
return ;
}
int ask(int rt,int l,int x,int r,int y)
{
if(t[rt].l==l&&t[rt].r==r) return ask(rt,y)-ask(rt,x-1);
int mid=(t[rt].l+t[rt].r)>>1;
if(r<=mid) return ask(rt<<1,l,x,r,y);
else if(l>mid) return ask(rt<<1|1,l,x,r,y);
else return ask(rt<<1,l,x,mid,y)+ask(rt<<1|1,mid+1,x,r,y);
}
int main()
{
freopen("mobilephones.in","r",stdin);
freopen("mobilephones.out","w",stdout);
while(scanf("%d",&op)&&op!=3)
{
if(op==0) scanf("%d",&s),build(1,1,s);
else if(op==1) scanf("%d%d%d",&x,&y,&a),updata(1,x+1,y+1,a);
else if(op==2) scanf("%d%d%d%d",&l,&x,&r,&y),printf("%d\n",ask(1,l+1,x+1,r+1,y+1));
else break;
}
return 0;
}