rt
支持微信支付
大概是想着维护区间最小值以及出现次数,但是WA
#include<bits/stdc++.h>
#define ls(x) (x<<1)
#define rs(x) ((x<<1)+1)
#define mid ((l+r)>>1)
using namespace std;
const int N=300005;
int n,m,i,a[N],l[N],r[N];
struct sqt
{
int cnt[N*4],Min[N*4];
bool t[N*4];
void pushup(int p)
{
if(Min[ls(p)]==Min[rs(p)])
{
Min[p]=Min[ls(p)];
cnt[p]=cnt[ls(p)]+cnt[rs(p)];
}
if(Min[ls(p)]<Min[rs(p)])
{
Min[p]=Min[ls(p)];
cnt[p]=cnt[ls(p)];
}
if(Min[ls(p)]>Min[rs(p)])
{
Min[p]=Min[rs(p)];
cnt[p]=cnt[rs(p)];
}
}
void addtag(int p,int l,int r,int x)
{
Min[p]+=x;
t[p]+=x;
pushup(p);
}
void pushdown(int p,int l,int r)
{
if(!t[p]) return;
addtag(ls(p),l,mid,t[p]);
addtag(rs(p),mid+1,r,t[p]);
t[p]=0;
}
void build(int p,int l,int r)
{
if(l==r)
{
Min[p]=a[l];
cnt[p]=1;
return;
}
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void add(int p,int l,int r,int L,int R,int x)
{
if(L>r||R<l) return;
if(L<=l&&r<=R) return addtag(p,l,r,x);
pushdown(p,l,r);
add(ls(p),l,mid,L,R,x);
add(rs(p),mid+1,r,L,R,x);
pushup(p);
}
int ask(int p,int l,int r,int L,int R)
{
if(L>r||R<l) return 0;
if(L<=l&&r<=R)
{
if(Min[p]) return 0;
else return cnt[p];
}
pushdown(p,l,r);
return ask(ls(p),l,mid,L,R)+ask(rs(p),mid+1,r,L,R);
}
}Sqt;
int main()
{
cin>>n>>m;
Sqt.build(1,1,n);
for(i=1;i<=m;i++)
{
cin>>l[i]>>r[i];
Sqt.add(1,1,n,l[i],r[i],1);
}
for(i=1;i<=m;i++)
{
Sqt.add(1,1,n,l[i],r[i],-1);
cout<<Sqt.ask(1,1,n,1,n)<<'\n';
Sqt.add(1,1,n,l[i],r[i],1);
}
return 0;
}