/*****Binary Index tree 12532******/
#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
#include <math.h>
#define SZ 100005
#define ll long long
using namespace std;
int num[SZ];
int neg[SZ];
int zero[SZ];
int maxInd;
void update(int *arr,int ind,int val)
{
while(ind<maxInd)
{
arr[ind]+=val;
ind+=(ind & (-ind));
}
}
int read(int *arr,int ind)
{
int res =0;
while(ind>0)
{
res+=arr[ind];
ind-=(ind & (-ind));
}
return res;
}
int main()
{
int a,n,k;
string s;
char ch;
int valu,idx;
while(cin>>n)
{
cin>>k;
memset(zero,0,sizeof(zero));
memset(neg,0,sizeof(neg));
maxInd =n+1;
for(int i=1;i<=n;i++)
{
cin>>a;
if(a<0)
{
update(neg,i,1);
}
else if(a==0)
{
update(zero,i,1);
}
num[i]=a;
}
s="";
//cout<<n<<" "<<k<<"\n";
while(k--)
{
cin>>ch>>idx>>valu;
if(ch=='C')
{
if(valu<0)
{
if(num[idx]==0)
{
update(zero,idx,-1);
update(neg,idx,1);
}
else if(num[idx]>0)
{
update(neg,idx,1);
}
}
else if(valu==0)
{
if(num[idx]>0)
{
update(zero,idx,1);
}
else if(num[idx]<0)
{
update(zero,idx,1);
update(neg,idx,-1);
}
}
else if(valu>0)
{
if(num[idx]==0)
{
update(zero,idx,-1);
}
else if(num[idx]<0)
{
update(neg,idx,-1);
}
}
num[idx] = valu;
}//end command type check
else if(ch=='P')
{
int d,m;
d = read(zero,valu) - read(zero,idx-1);
m = read(neg,valu) - read(neg,idx-1);
//cout<<"dm = "<<d<<" "<<m<<"\n";
if(d>0)
{
s.append(1u,'0');
//cout<<"0";
}
else if(m%2==1)
{
s.append(1u,'-');
//cout<<"-";
}
else if(d==0 && (m%2)==0)
s.append(1u,'+');
//cout<<"+";
}
}
cout<<s<<"\n";
}
return 0;
}