气死我了弄了一个上午, 主要是add函数有问题,但是不知道怎么解决
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,k,x;
int kk[50];
int ans;
char op;
int l1,r1;
struct node{
int l;
int r;
int sum;
}t[N*4];
void build(int i,int l,int r){
t[i].l = l;
t[i].r = r;
t[i].sum = 1;
if(l==r) return ;
int mid=(l+r)>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
}
void add(int i,int x,int l,int r){
// cout << "t[i].l:" << t[i].l << "\n";
// cout << "t[i].r:" << t[i].r << "\n";
if(t[i].l>=l&&t[i].r<=r){
kk[t[i].sum]--; // 原来的蛋糕数种类减一
t[i].sum = x;
kk[t[i].sum]++; // 新的蛋糕数种类加一
// cout << "a!!!\n";
return ;
}
if(t[i*2].r>=l) add(i*2,x,l,r);
if(t[i*2+1].l<=r) add(i*2+1,x,l,r);
}
int find(int i,int l,int r){
int cnt=0;
for(int i=1;i<=k;i++){
if(kk[i]>0) cnt++;
}
return cnt;
}
int main(){
cin >> n >> m >> k;
build(1,1,n);
kk[1] = n;
for(int i=1;i<=m;i++){
cin >> op >> l1 >> r1;
if(op=='C'){
cin >> x;
add(1,x,l1,r1);
// for(int j=1;j<=k;j++){
// cout << "kk:" << kk[j] << " ";
// }
// cout << "\n";
}else if(op=='P'){
ans = find(1,l1,r1);
cout << ans << "\n";
}
}
return 0;
}