标签:blog os io 问题 ar div amp size
没有用到懒惰标记的线段树问题,不过通过这道题找到了不用数组就能找到写update的方法了
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define max 50010
#define INF 0x3f3f3f3f
int tree[max*3],ans;
void build(int rt,int L,int R)
{
if(L== R)
{
scanf("%d",&tree[rt]);
}
else
{
int M = (L+R)/2;
build(rt*2,L,M);
build(rt*2+1,M+1,R);
tree[rt]= tree[rt*2]+tree[rt*2+1];
}
}
void update(int rt,int L,int R,int p,int q)
{
if(L==R&&L == p)
{
tree[rt]+= q;
}
else
{
int M = (L+R)/2;
if (p<=M) update(rt*2,L,M,p,q);
else
update(rt*2+1,M+1,R,p,q);
tree[rt]= tree[rt*2]+tree[rt*2+1];
}
}
void query(int cur,int x,int y,int s,int t)
{
int mid = (x+y)>> 1,ls = cur<< 1,rs =cur<<1|1;
if(x>= s&&y<= t)
{
ans += tree[cur];
return ;
}
//pushdown(cur,x,y);
if(mid>= s)
query(ls,x,mid,s,t);
if(mid+1<= t)
query(rs,mid+1,y,s,t);
}
int main()
{
int n,a,b,c,count =0;scanf("%d",&n);
while(n--)
{
memset(tree,0,sizeof(tree));
ans =0;
count++;
scanf("%d",&a);
build(1,1,a);
char s[10];
printf("Case %d:\n",count);
while((scanf("%s",s)!= EOF)&&s[0]!=‘E‘)
{
ans =0;
scanf("%d%d",&b,&c);
if(s[0]==‘Q‘){query(1,1,a,b,c);printf("%d\n",ans);}
else if(s[0]==‘A‘){
update(1,1,a,b,c);
}
else update(1,1,a,b,-c);
}
}
return 0;
}
标签:blog os io 问题 ar div amp size
原文地址:http://www.cnblogs.com/DUANZ/p/3885221.html