北大2777Count Color提交时出现Runtime Error不知道哪里出错了,请高手指点
#include<iostream>
using namespace std;
int flag[35];
struct Seg_tree
{
int left,right;
int color;
int num;
int calmid()
{
return (left+right)/2;
}
};
Seg_tree tree[200005];
void build(int left,int right,int idx)
{
tree[idx].left=left;
tree[idx].right=right;
tree[idx].color=1;
tree[idx].num=1;
if(left==right)
return ;
int mid=tree[idx].calmid();
build(left,mid,idx*2);
build(mid+1,right,idx*2+1);
}
void update(int left,int right,int color,int idx)
{
if(tree[idx].left==left&&tree[idx].right==right)
{
tree[idx].color=color;
return ;
}
if(tree[idx].color>=1)
{
tree[idx*2].color=tree[idx].color;
tree[idx*2+1].color=tree[idx].color;
tree[idx].color=-1;
}
int mid=tree[idx].calmid();
if(right<=mid)
update(left,right,color,idx*2);
else if(left>mid)
update(left,right,color,idx*2+1);
else
{
update(left,mid,color,idx*2);
update(mid+1,right,color,idx*2+1);
}
}
void search(int left,int right,int idx)
{
if(tree[idx].color>=1)
{
flag[tree[idx].color]++;
return ;
}
int mid=tree[idx].calmid();
if(right<=mid)
search(left,right,idx*2);
else if(left>mid)
search(left,right,idx*2+1);
else
{
search(left,mid,idx*2);
search(mid+1,right,idx*2+1);
}
}
int main()
{
int M,N,Q;
while(cin>>M>>N>>Q)
{
char ch;
int a,b,c,i;
build(1,M,1);
for(i=0;i<Q;++i)
{
cin>>ch;
if(ch=='C')
{
cin>>a>>b>>c;
update(a,b,c,1);
}
else
{
memset(flag,0,sizeof(flag));
cin>>a>>b;
search(a,b,1);
int ans=0;
for(int j=1;j<=30;++j)
if(flag[j]>0)
ans++;
cout<<ans<<endl;
}
}
}
return 0;
}