HDOJ 5023 A Corrupt Mayor's Performance Art

//线段树(区间更新)
//用 c++ 交就是RE,换成 g++ 过了
#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 3000010;//这里要稍微开大点,不然容易RE
vector<int>ve;
int y1, y2, v;
int setv[maxn<<2];
void maintain(int o){
    int lc = o * 2, rc = o * 2 + 1;
}
void build_tree(int o, int L, int R){
    int lc = o * 2, rc = o * 2 + 1;
    setv[o] = 2;
    if( L == R )return ;
    int M = ( R + L ) / 2;
    build_tree(lc, L, M);
    build_tree(rc, M+1,R);
}

void pushdown(int o, int L ,int R){
    int lc = o * 2, rc = o * 2 + 1;
    if(setv[o]>0&&setv[o]<=30){
        int M = ( R + L ) / 2;
        setv[lc] = setv[rc] = setv[o];
        setv[o] = -1;
    }
    return ;
}

void update(int o, int l, int r){
    int lc = o*2, rc = o*2+1;
    if(y1<=l&&y2>=r){
        setv[o] = v;return ;
    }
    else
    {
        pushdown(o,l,r);
        int m = (l+r)/2;
        if(y1<=m)update(lc, l, m);
        if(y2>m)update(rc, m+1, r);
    }
}

void query(int o, int l, int r)
{
   if(setv[o]>=0&&setv[o]<=30){
        ve.push_back(setv[o]);
   }
   else {
        int m = (l+r)/2;
        if(y1<=m)query(o*2,l,m);
        if(y2>m)query(o*2+1,m+1,r);
   }
}
int main(){
    //freopen("in.txt","r",stdin);
    int n,m;
    char ch[3];
    while(~scanf("%d%d",&n,&m),n||m){
        ve.clear();
        memset(setv,0,sizeof(setv));
        build_tree(1,1,n);
        for(int i=0;i<m;++i){
            scanf("%s%d%d",ch,&y1,&y2);
            if(ch[0]=='P'){
                scanf("%d",&v);
                update(1,1,n);
            }
            else if(ch[0]=='Q'){
                query(1,1,n);
                sort(ve.begin(),ve.end());
                ve.erase(unique(ve.begin(),ve.end()),ve.end());
                int len = ve.size();
                ve[len] = -1;
                for(int j = 0; j < len; ++j){
                    j == len-1 ? printf("%d\n",ve[j]) : printf("%d ",ve[j]);  
                }
                ve.clear();
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值