zoukankan      html  css  js  c++  java
  • 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("
    ");*/
                    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("
    ");
        }
    }
  • 相关阅读:
    Java static 关键字 静态初始化块
    一致性哈希
    Java函数传递方式值传递
    Scala 小练习
    Scala 推荐递归编程
    白话 Scala 控制抽象
    函数柯里化(curry)
    Scala 闭包 closure
    Scala 参数(类型)推断
    xcode配置文件中,Architectures表示的意义
  • 原文地址:https://www.cnblogs.com/sweat123/p/4712149.html
Copyright © 2011-2022 走看看