uva12532 线段树单点更新
#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"); } }