线段树 1

#include"iostream"
using namespace std;
const int maxinterval=100;
int upper,tree[maxinterval+1];
void init()
{
	upper=0;memset(tree,0,sizeof(tree));
}
void update(int r,int x)  //sum[1...r]+=x;
{
	while(r<=upper){
		tree[r]+=x;r+=(r&(r^(r-1)));
	}
}
int sum(int r) //return sum[1...r]
{
	int res=0;
	while(r>0){
		res+=tree[r];r-=(r&(r^(r-1)));
	}
	return res;
}
int main()
{
	cout<<"init:"<<endl;
	init();
	for(int i=1;i<=maxinterval;i++)
		cout<<tree[i]<<" ";
	cout<<endl;
	upper=100;
	cout<<sum(8)<<endl;

	update(8,5);
	cout<<sum(8)<<endl;
	for(int i=1;i<=maxinterval;i++)
		cout<<tree[i]<<" ";
	cout<<endl;
	return 0;
}
#include <cstdio> //hdu 1166 地兵布阵
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1

const int maxn = 55555;

int sum[maxn << 2];
void PushUP(int rt) {

    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];

}

void build(int l, int r, int rt) {

    if (l == r) {

        scanf("%d", &sum[rt]);

        return ;

    }

    int m = (l + r) >> 1;

    build(lson);

    build(rson);

    PushUP(rt);

}

void update(int p, int add, int l, int r, int rt) {

    if (l == r) {

        sum[rt] += add;

        return ;

    }

    int m = (l + r) >> 1;

    if (p <= m) update(p , add , lson);

    else update(p , add , rson);

    PushUP(rt);

}

int query(int L, int R, int l, int r, int rt) {

    if (L <= l && r <= R) {

        return sum[rt];

    }

    int m = (l + r) >> 1;

    int ret = 0;

    if (L <= m) ret += query(L , R , lson);

    if (R > m) ret += query(L , R , rson);

    return ret;

}

int main() {

    int T , n;

    scanf("%d", &T);

    for (int cas = 1 ; cas <= T ; cas ++) {

        printf("Case %d:\n", cas);

        scanf("%d", &n);

        build(1 , n , 1);

        char op[10];

        while (scanf("%s", op)) {

            if (op[0] == 'E') break;

            int a , b;

            scanf("%d%d", &a, &b);

            if (op[0] == 'Q') printf("%d\n", query(a , b , 1 , n , 1));

            else if (op[0] == 'S') update(a , -b , 1 , n , 1);

            else update(a , b , 1 , n , 1);

        }

    }

    return 0;

}
#include"iostream"  //POJ3246
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
#define ll long long
#define cl(a) memset(a,0,sizeof(a));
using namespace std;
const int maxn=50000*4;
int Max[maxn],Min[maxn],num[maxn];
void pushup(int rt)
{
	Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
	Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);
}
void build(int l,int r,int rt)
{
	if(l==r)
	{
		scanf("%d",&num[rt]);
		Max[rt]=Min[rt]=num[rt];
		return ;
	}
	build(lson);
	build(rson);
	pushup(rt);
}
int Maxx=-9999;
int Minn=99999999;
void query(int L,int R,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		Maxx=max(Maxx,Max[rt]);
		Minn=min(Minn,Min[rt]);
		return;
	}
	if(L<=mid) query(L,R,lson);
	if(R>mid) query(L,R,rson);
}
int main()
{
#ifdef OJ
freopen("a.txt","r",stdin);
#endif // DEBUG
	int n,q;
	while(scanf("%d%d",&n,&q)!=EOF)
	{
		build(1,n,1);
		for(int i=0;i<q;i++)
		{
			int a,b;
			Maxx=-9999;
			Minn=99999999;
			scanf("%d%d",&a,&b);
			query(a,b,1,n,1);
			printf("%d\n",Maxx-Minn);
		}
	}
	return 0;
}

#include"iostream" //HDU 1754
#include"stdio.h"
#include"algorithm"
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
#define ll long long
#define cl(a) memset(a,0,sizeof(a));
using namespace std;
const int maxn=200000*4;
int num[maxn];
int Max[maxn];
void pushup(int rt)
{
	Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void update(int p,int add,int l,int r,int rt)
{
	if(l==r) {
		Max[rt]=add;
		return;
	}
	if(p<=mid) update(p,add,lson);
	else update(p,add,rson);
	pushup(rt);
}
void build(int l,int r,int rt)
{
	if(l==r)
	{
		scanf("%d",&Max[rt]);
		return ;
	}
	build(lson);
	build(rson);
	pushup(rt);
}
int Maxx=-999999;
int query(int L,int R,int l,int r,int rt)
{
	if(L<=l&&r<=R) return Max[rt];
	if(L<=mid) Maxx=max(Maxx,query(L,R,lson));
	if(R>mid) Maxx=max(Maxx,query(L,R,rson));
	return Maxx;
}
int main()
{
#ifdef DEBUG
	freopen("a.txt","r",stdin);  
#endif // DEBUG

	int n,q;
	while(scanf("%d%d",&n,&q)!=EOF)
	{
		build(root);
		for(int i=0;i<q;i++)
		{
			int a,b;
			char op[10];
			scanf("%s",op);
			if(op[0]=='Q')
			{
				int a,b;
				scanf("%d%d",&a,&b);
				Maxx=-999999;
				printf("%d\n",query(a,b,root));
			}
			else
			{
				int p,add;
				scanf("%d%d",&p,&add);
				update(p,add,root);
			}
		}
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值