P8441。
#include<bits/stdc++.h>
#define mkp make_pair
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, c[N], ans[N], is[N];
inline void add(int a, int x){for(;a<=n;a+=(a&-a))c[a]+=x;}
inline int ask(int a){int b=0;for(;a;a-=(a&-a))b+=c[a];return b;}
multiset<pair<int,int> > S[N];
struct qq{int x, y, a, b;}qu[N*100];int cur;
inline void ad(int x1, int y1, int x2, int y2, int a)
{
// printf("%d %d %d %dttt\n", x1, y1, x2, y2, a);
qu[++cur] = {x1,y1,a,1}, qu[++cur] = {x2+1,y2+1,a,1};
qu[++cur] = {x1,y2+1,-a,1}, qu[++cur] = {x2+1,y1,-a,1};
}
inline void da(int l1, int r1, int l2, int r2, int a){ad(r1+1,l2,r2,n,a);}
void ins1(int a, int l, int r, int k)
{
// printf("%d %d %d %dsss\n", a, l, r, k);
auto it = S[a].lower_bound(mkp(l,r));
assert(it!=S[a].begin());
auto itt = prev(it);
da(itt->first,itt->second,it->first,it->second,a*k);
}
void add(int a, int l, int r)
{
auto p = mkp(l,r);
auto it = S[a].lower_bound(p);
if(it!=S[a].end()) ins1(a,it->first,it->second,-1);
S[a].insert(p);
it = S[a].upper_bound(p);
if(it!=S[a].end()) ins1(a,it->first,it->second,1);
it = S[a].lower_bound(p);
if(it!=S[a].end()) ins1(a,it->first,it->second,1);
}
void del(int a, int l, int r)
{
auto p = mkp(l,r);
auto it = S[a].upper_bound(p);
if(it!=S[a].end()) ins1(a,it->first,it->second,-1);
it = S[a].lower_bound(p);
if(it!=S[a].end()) ins1(a,it->first,it->second,-1);
if(it!=S[a].end()) S[a].erase(it);
it = S[a].lower_bound(p);
if(it!=S[a].end()) ins1(a,it->first,it->second,1);
}
inline void ins(int a, int l, int r)
{
auto p = mkp(l,l);
auto it = S[a].lower_bound(p);
int L = l, R = r;
if(it!=S[a].begin())
{
auto itt = it;itt--;
if(itt->second>=l)
L = itt -> first, R = max(R,itt->second), del(a,itt->first,itt->second);
}
for(;it!=S[a].end()&&R>=it->first;it++)
R = max(R,it->second), del(a,it->first,it->second);
add(a,L,R);
}
bool cmp(qq a,qq b){return a.x<b.x;}
void cdq(int l, int r)
{
if(l==r) return;
int mid = l + r >> 1, i, j;
cdq(l,mid), cdq(mid+1,r);
sort(&qu[l],&qu[mid]+1,cmp);
sort(&qu[mid+1],&qu[r]+1,cmp);
for(i=mid+1,j=l;i<=r;i++)
{
while(j<=mid&&qu[j].x<=qu[i].x)
{
if(qu[j].b==1) add(qu[j].y,qu[j].a);
j++;
}
if(qu[i].b==2) ans[qu[i].a] += ask(qu[i].y);
}
for(i=l;i<j;i++) if(qu[i].b==1) add(qu[i].y,-qu[i].a);
}
signed main()
{
int m, i;
scanf("%*s%lld%lld", &n, &m);
for(i=1;i<=N-10;i++) S[i].insert(mkp(0,0));
for(i=1;i<=m;i++)
{
int op, l, r, x;
scanf("%lld%lld%lld", &op, &l, &r);
if(op==1) scanf("%lld", &x), ins(x,l,r);
else qu[++cur] = {l,r,i,2}, is[i] = 1;
}
// for(i=1;i<=cur;i++) printf("%d %d %d %daaa\n", qu[i].x, qu[i].y, qu[i].a, qu[i].b);
cdq(1,cur);
for(i=1;i<=m;i++) if(is[i]) printf("%lld\n", ans[i]);
return 0;
}
第五十行:if(it!=S[a].end()) S[a].erase(it);。
前面第 48 行有 it = S[a].lower_bound(p);,怎么回事呢。