uva12532 线段树单点更新
2015-08-07 22:00
459 查看
#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 100010 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]); if(sum[rt]==0) sum[rt]=0; else if(sum[rt]>0) sum[rt]=1; else sum[rt]=-1; return ; } int m=(l+r)/2; build(lson); build(rson); pushup(rt); } void updata(int p,int c,int l,int r,int rt) { if(l==r) { sum[rt]=c; return; } int m=(l+r)/2; if(m>=p) updata(p,c,lson); else updata(p,c,rson); pushup(rt); } int query(int L,int R,int l,int r,int rt) { int m = (l+r) / 2; int ans = 1; if(L <= l && r <= R) return sum[rt]; if(L<=m) ans*=query(L,R,lson); if(m < R) ans*=query(L,R,rson); return ans; } int main() { char way[5]; int i,j,n,k; int flag; while(scanf("%d%d",&n,&k)!=EOF) { queue<char>q; build(1,n,1); while(k--) { int x,y; scanf("%s %d %d",&way,&x,&y); if(way[0]=='C') { if(y>0)y=1; else if(y==0) y=0; else y=-1; updata(x,y,1,n,1); } else { char v; flag=query(x,y,1,n,1); /*for(i=0;i<8;i++) printf("%d ",sum[i]); printf("\n");*/ if(flag==0) v='0'; else if(flag<0) v='-'; else v='+'; q.push(v); } } while(!q.empty()) { char s=q.front(); q.pop(); printf("%c",s); } printf("\n"); } }
相关文章推荐
- HDU 3081 Marriage Match II(最大流 + 并查集)
- Cocos2d-x学习笔记(四)—— 内存管理
- Lync 2013 语言包安装
- 15年的IT路
- 【js】——如何判断一个字符是否在某个字符数组中
- C++中构造函数和析构函数
- hive 实战笔记case2
- 二叉树的前序,中序,后序遍历
- [算法专题] 深度优先搜索&回溯剪枝
- Mac 安装 Ruby, Rails 运行环境
- 三行css代码实现垂直居中
- FMDB
- Entity Framework教程(第二版)
- Uva-11210-Chinese Mahjong
- #linux基本概念及操作(实验楼实验一)
- 15、C语言和设计模式(适配器模式)
- List、Set、Map集合存放null解析及HashMap、Hashtable异同点解析
- COJ 0970 WZJ的数据结构(负三十)树分治
- hdu5358 First One(尺取法)
- Nginx 学习笔记一