#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
int updateUtil(int* st,int i,int value,int i1,int j1,int id){
if (i1==j1 && i1==i){
st[id-1]=value;
return value;
}
else if ((i1<i&&j1<i) || (i1>i && j1>i)) {
return st[id-1];
}
st[id-1]=updateUtil(st,i,value,i1,(i1+j1)/2,id*2)* updateUtil(st,i,value,((i1+j1)/2)+1,j1,(id*2)+1);
return st[id-1];
}
void update(int * st,int i,int value,int n){
updateUtil(st,i,value,1,n,1);
}
int getSumaUtil(int* st,int i,int j,int i1,int j1,int id){
if (i1>=i && j1<=j) return st[id-1];
else if ((i1<i&&j1<i) || (i1>j && j1>j)) {
return 1;
}
return getSumaUtil(st,i,j,i1,(i1+j1)/2,id*2)* getSumaUtil(st,i,j,((i1+j1)/2)+1,j1,(id*2)+1);
}
int getSuma(int * st,int i,int j,int n){
return getSumaUtil(st,i,j,1,n,1);
}
int segmentTree(int * values,int * st ,int i,int j,int id){
if (i==j) {
st[id-1]=values[i-1];
return st[id-1];
}
st[id-1]= segmentTree(values,st,i,(i+j)/2,2*id)* segmentTree(values,st,((i+j)/2)+1,j,(2*id)+1);
return st[id-1];
}
int * buildSegmentTree(int* ar,int size){
int s = pow(2,ceil(log2(size))+1)-1;
int *st = new int[s];
memset(st,s,1);
segmentTree(ar,st,1,size,1);
return st;
}
int main(){
int n,q,in,fin,aux;
char c;
while (cin>>n>>q){
string cade="";
int ar[n];
for (int i=0;i<n;i++){
scanf("%d",&aux);
if (aux==0) ar[i]=0;
else if (aux>0) ar[i]=1;
else ar[i]=-1;
}
int * st = buildSegmentTree(ar,n);
for (int i=0;i<q;i++){
cin.ignore();
scanf ("%c %d %d",&c,&in,&fin);
if (c=='C'){
if (fin==0)fin=0;
else if (fin>0) fin=1;
else fin=-1 ;
update(st,in,fin,n);
}
else {
int res= getSuma(st,in,fin,n);
cout<<res<<endl;
if (res==0) cade+="0";
else if (res>0) cade+="+";
else cade+="-";
}
}
cout<<cade<<endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8Y3N0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IHVwZGF0ZVV0aWwoaW50KiBzdCxpbnQgaSxpbnQgdmFsdWUsaW50IGkxLGludCBqMSxpbnQgaWQpewoJaWYgKGkxPT1qMSAmJiBpMT09aSl7CgkJc3RbaWQtMV09dmFsdWU7CQoJCXJldHVybiB2YWx1ZTsKCX0gCgllbHNlIGlmICgoaTE8aSYmajE8aSkgfHwgKGkxPmkgJiYgajE+aSkpIHsKCQlyZXR1cm4gc3RbaWQtMV07Cgl9CglzdFtpZC0xXT11cGRhdGVVdGlsKHN0LGksdmFsdWUsaTEsKGkxK2oxKS8yLGlkKjIpKiB1cGRhdGVVdGlsKHN0LGksdmFsdWUsKChpMStqMSkvMikrMSxqMSwoaWQqMikrMSk7CglyZXR1cm4gc3RbaWQtMV07CgkKfQp2b2lkIHVwZGF0ZShpbnQgKiBzdCxpbnQgaSxpbnQgdmFsdWUsaW50IG4pewoJdXBkYXRlVXRpbChzdCxpLHZhbHVlLDEsbiwxKTsKfQppbnQgZ2V0U3VtYVV0aWwoaW50KiBzdCxpbnQgaSxpbnQgaixpbnQgaTEsaW50IGoxLGludCBpZCl7CglpZiAoaTE+PWkgJiYgajE8PWopIHJldHVybiBzdFtpZC0xXTsKCWVsc2UgaWYgKChpMTxpJiZqMTxpKSB8fCAoaTE+aiAmJiBqMT5qKSkgewoJCXJldHVybiAxOwoJfQoJcmV0dXJuICBnZXRTdW1hVXRpbChzdCxpLGosaTEsKGkxK2oxKS8yLGlkKjIpKiBnZXRTdW1hVXRpbChzdCxpLGosKChpMStqMSkvMikrMSxqMSwoaWQqMikrMSk7Cn0KaW50IGdldFN1bWEoaW50ICogc3QsaW50IGksaW50IGosaW50IG4pewoJcmV0dXJuIGdldFN1bWFVdGlsKHN0LGksaiwxLG4sMSk7Cn0JCmludCBzZWdtZW50VHJlZShpbnQgKiB2YWx1ZXMsaW50ICogc3QgLGludCBpLGludCBqLGludCBpZCl7CglpZiAoaT09aikgewoJCXN0W2lkLTFdPXZhbHVlc1tpLTFdOwoJCXJldHVybiBzdFtpZC0xXTsKCX0KCXN0W2lkLTFdPSBzZWdtZW50VHJlZSh2YWx1ZXMsc3QsaSwoaStqKS8yLDIqaWQpKiBzZWdtZW50VHJlZSh2YWx1ZXMsc3QsKChpK2opLzIpKzEsaiwoMippZCkrMSk7CglyZXR1cm4gc3RbaWQtMV07Cgp9CmludCAqIGJ1aWxkU2VnbWVudFRyZWUoaW50KiBhcixpbnQgc2l6ZSl7CglpbnQgcyA9IHBvdygyLGNlaWwobG9nMihzaXplKSkrMSktMTsKCWludCAqc3QgPSBuZXcgaW50W3NdOwoJbWVtc2V0KHN0LHMsMSk7CglzZWdtZW50VHJlZShhcixzdCwxLHNpemUsMSk7CglyZXR1cm4gc3Q7Cn0KaW50IG1haW4oKXsKCWludCBuLHEsaW4sZmluLGF1eDsKCWNoYXIgYzsKCXdoaWxlIChjaW4+Pm4+PnEpewoJCXN0cmluZyBjYWRlPSIiOwoJCWludCBhcltuXTsKCQlmb3IgKGludCBpPTA7aTxuO2krKyl7CgkJCXNjYW5mKCIlZCIsJmF1eCk7CgkJCWlmIChhdXg9PTApIGFyW2ldPTA7CgkJCWVsc2UgaWYgKGF1eD4wKSBhcltpXT0xOwoJCQllbHNlIGFyW2ldPS0xOwoJCX0KCQkKCQlpbnQgKiBzdCA9IGJ1aWxkU2VnbWVudFRyZWUoYXIsbik7CgkJZm9yIChpbnQgaT0wO2k8cTtpKyspewoJCQljaW4uaWdub3JlKCk7CgkJCXNjYW5mICgiJWMgJWQgJWQiLCZjLCZpbiwmZmluKTsKCQkJaWYgKGM9PSdDJyl7CgkJCQlpZiAoZmluPT0wKWZpbj0wOwoJCQkJZWxzZSBpZiAoZmluPjApIGZpbj0xOwoJCQkJZWxzZSBmaW49LTEJOwkKCQkJCXVwZGF0ZShzdCxpbixmaW4sbik7CgkJCX0KCQkJZWxzZSB7CgkJCQlpbnQgcmVzPSBnZXRTdW1hKHN0LGluLGZpbixuKTsKCQkJCWNvdXQ8PHJlczw8ZW5kbDsKCQkJCWlmIChyZXM9PTApIGNhZGUrPSIwIjsKCQkJCWVsc2UgaWYgKHJlcz4wKSBjYWRlKz0iKyI7CgkJCQllbHNlIGNhZGUrPSItIjsKCQkJfQoJCX0KCQljb3V0PDxjYWRlPDxlbmRsOwoJCQoKCX0KfQo=