Skip to content

Instantly share code, notes, and snippets.

@bowbowbow
Last active January 29, 2016 02:55
Show Gist options
  • Save bowbowbow/d1c0bba5f284fad21de0 to your computer and use it in GitHub Desktop.
Save bowbowbow/d1c0bba5f284fad21de0 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <cstdio>
using namespace std;
#define MAXN 100005
int N, K, indexTree[4*MAXN], arr[MAXN], p;
void init(){
p = 1;
while(p < N) p <<= 1;
for(int i = 0 ; i < N ; i++)
indexTree[p+i] = arr[i];
for(int i = p-1 ; i >=1 ; i--)
indexTree[i] = indexTree[i*2] * indexTree[i*2+1];
}
void update(int index, int value){
index += p-1;
indexTree[index] = value;
for(int i = (index >> 1); i >= 1; i >>= 1)
indexTree[i] = indexTree[i*2]*indexTree[i*2+1];
}
int find(int left, int right){
left += p-1;
right += p-1;
int ans = 1;
while(left <= right){
if(left & 1){
ans *= indexTree[left];
left++;
}
if(!(right & 1)){
ans *= indexTree[right];
right--;
}
left >>=1 ,right >>=1;
}
return ans;
}
int trans(int a){
if(a>0)
return 1;
else if(a==0)
return 0;
else
return -1;
}
int main(){
while(scanf("%d%d", &N, &K) != EOF){
for(int i = 0 ; i < N ; i++){
scanf("%d", &arr[i]);
arr[i] = trans(arr[i]);
}
init();
for(int i = 1 ; i<= K ; i++){
char T;
int a, b;
scanf("\n%c%d%d", &T, &a, &b);
if(T == 'C'){
update(a, trans(b));
}else{
int ans = find(a, b);
if(ans > 0)
printf("+");
else if(ans == 0)
printf("0");
else
printf("-");
}
}
printf("\n");
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment