校门外的树

思路

转为括号序列,左括号:区间左端点,右括号:区间右端点
k = 1 时,l 处的左括号数目加 1,r 处的右括号数目加 1
k = 2 时,[1,r] 区间的左括号数目 减去 [1,l-1] 区间的右括号数目 就是答案

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5+10;

int tr[N],trr[N];
int n,m;

int lowbit(int x){
    return  x & -x;
}

void add(int t[],int x,int v){
    for(int i=x;i<=n;i+=lowbit(i)) t[i]+=v;
}

int sum(int t[],int x){
    int res=0;
    for(int i=x;i;i-=lowbit(i)) res+=t[i];
    return res;
}

int query(int l,int r){
    return sum(tr,r)-sum(trr,l-1);
}

int main(){
    cin>>n>>m;
    while(m--){
        int k,l,r;
        cin>>k>>l>>r;
        if(l>r) swap(l,r);
        if(k==1) add(tr,l,1),add(trr,r,1);
        else cout<<query(l,r)<<endl;
    }

    return 0;
}