UVA 12532-Interval Product(BIT)

时间:2023-03-10 02:42:45
UVA 12532-Interval Product(BIT)

题意:

给n个数字的序列,C v p 把v位上的数字置成p , S l r代表求区间[l,r]各数字相乘得数的符号,对于每个S输出所得符号(’+‘,’-‘,’0‘)

分析:

开两个数组表示区间负数的个数、0的个数、当数字被改时,更新数组、查询时区间含0符号是0,再根据负数的个数的奇偶判断。

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
#define N 100010
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod = ;
int zero[N],neg[N],n,m,a[N];
int sumn(int x){
int num=;
while(x>){
num+=neg[x];
x-=(x&(-x));
}
return num;
}
int sumz(int x){
int num=;
while(x>){
num+=zero[x];
x-=(x&(-x));
}
return num;
}
void add_init(int x){
if(a[x]<=){
int tmp=a[x];
while(x<=n){
if(tmp==)
zero[x]+=;
else
neg[x]+=;
x+=(x&(-x));
}
}
}
void add(int x,int d){
int tmp;
if(a[x]>){
a[x]=d;
if(d<=){
while(x<=n){
if(d<)
neg[x]+=;
else
zero[x]+=;
x+=(x&(-x));
}
}
}
else if(a[x]==){
a[x]=d;
if(d!=){
while(x<=n){
zero[x]-=;
if(d<)neg[x]+=;
x+=(x&(-x));
}
}
}
else{
a[x]=d;
if(d>=){
while(x<=n){
neg[x]-=;
if(d==)zero[x]+=;
x+=(x&(-x));
}
}
}
}
int main()
{
char op[];
string s;
while(~scanf("%d%d",&n,&m)){
s="";
memset(neg,,sizeof(neg));
memset(zero,,sizeof(zero));
int b;
for(int i=;i<=n;++i){
scanf("%d",&a[i]);
add_init(i);
}
/*for(int i=1;i<=n;++i)
cout<<sumn(i)<<" "<<sumz(i)<<endl;*/
int p,v;
while(m--){
scanf("%s%d%d",op,&p,&v);
if(op[]=='C'){
add(p,v);
}
else{
int tmp1=sumn(v)-sumn(p-);
int tmp2=sumz(v)-sumz(p-);
if(tmp2>)
s+='';
else{
if(tmp1%)
s+='-';
else s+='+';
}
}
}
cout<<s<<endl;
}
return ;
}