话说 Acwing 上写题解里的题目来源都没有 UVA 吗?
这道题只问正负性和答案为零情况。直接线段树扫一遍即可。
#include<iostream>
typedef long long LL;
#define _P(A) A=-~A
#define fione(i,a,b) for(int i=a;i<=b;_P(i))
#define Fione(i,a,b) for(int i=a;i<b;_P(i))
#define ls(rt) rt<<1
#define rs(rt) rt<<1|1
#define mid (l+r>>1)
#define lson l,mid,ls(rt)
#define rson mid+1,r,rs(rt)
const int NUMBER1=1e5;
char op;
int tr[(NUMBER1<<2)+5],n,m;
inline void push_up(const int &rt){tr[rt]=tr[ls(rt)]*tr[rs(rt)];}
void build(int l,int r,int rt){
if(l==r){
int s;
std::cin>>s;
if(!s)tr[rt]=s;
else tr[rt]=s>0?1:-1;
return;
}
build(lson);build(rson);
push_up(rt);
}
void update(int l,int r,int rt,int p,int data){
if(l==r)return tr[rt]=data,void(0);
if(p<=mid)update(lson,p,data);
else update(rson,p,data);
push_up(rt);
}
int query(int l,int r,int rt,int x,int y){
if(x<=l&&r<=y)return tr[rt];
int res(1);
if(x<=mid)res*=query(lson,x,y);
if(mid<y)res*=query(rson,x,y);
return res;
}
inline void NOIP2023RPUPUP(){
build(1,n,1);
for(int s,b;m--;){
std::cin>>op>>s>>b;
if(op=='C'){
if(b)b=b>0?1:-1;
update(1,n,1,s,b);
}else{
int sb=query(1,n,1,s,b);
if(sb)std::cout<<(sb>0?'+':'-');
else std::cout<<0;
}
}
std::cout<<'\n';
}
signed main(){
std::cin.tie(NULL)->std::ios::sync_with_stdio(false);
while(std::cin>>n>>m)NOIP2023RPUPUP();
return 0;
}