事情是这样的:我最后一个点没过,于是想着卡常优化尝试过
但是全WA qwq
code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <cstring>
#define int long long
using namespace std;
struct node {
int l, r;
mutable int val;
node(int L, int R = -1, int Val = 0) { l = L, r = R, val = Val; }
bool operator<(const node& a) const { return l < a.l; }
};
typedef pair<int, int> pii;
inline int in()
{
int k=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
return k*f;
}
set<node> odt;
int a[100010], n, m, k;
bool b[40];
inline auto split(int pos) {
auto it = odt.lower_bound(node(pos));
if (it != odt.end() && it->l == pos)
return it;
it--;
int l = it->l, r = it->r;
int val = it->val;
odt.erase(it);
odt.insert(node(l, pos - 1, val));
return odt.insert(node(pos, r, val)).first;
}
inline void assign(int l, int r, int val) {
auto itr = split(r + 1), itl = split(l);
odt.erase(itl, itr);
odt.insert(node(l, r, val));
}
inline int diff(int l, int r) {
memset(b, 0, sizeof(b));
auto itr = split(r + 1), itl = split(l);
int sum = 0;
for (auto i = itl; i != itr; i++)
if (!b[i->val]) {
sum++;
b[i->val] = 1;
}
return sum;
}
void test() {
cout << "\n";
for (auto i = odt.begin(); i != odt.end(); i++) cout << i->l << " " << i->r << " " << i->val << "\n";
cout << "\n";
}
signed main() {
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
// cin >> n >> k >> m;
// freopen("P1558_1.in","r",stdin);
// freopen("1.txt","w",stdout);
n=in();
k=in();
m=in();
odt.insert(node(1, n, 1));
odt.insert(node(n+1,n+1,1));
for (int i = 1; i <= m; i=-~i) {
char op;
int x, y, z;
// cin >> op >> x >> y;
scanf("%c",&op);
x=in();
y=in();
if(x > y)
swap(x, y);
if (op == 'C') {
// cin >> z;
z=in();
assign(x, y, z);
}
if (op == 'P')
printf("%d\n",diff(x,y));
// cout << diff(x, y) << "\n";
// test();
}
return 0;
}