1. 程式人生 > >[TYVJ1473]校門外的樹3

[TYVJ1473]校門外的樹3

-- etc 兩個 val digi for cnblogs spa tdi

思路:

維護兩個樹狀數組,一個記錄種樹區間左端點,一個記錄右端點。
每次詢問查詢“看不見的樹區間”,即右端點小於查詢區間左端點和左端點小於查詢區間右端點。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<cstring>
 4 inline int getint() {
 5     char ch;
 6     while(!isdigit(ch=getchar()));
 7     int x=ch^0;
 8     while(isdigit(ch=getchar())) x=(((x<<2
)+x)<<1)+(ch^0); 9 return x; 10 } 11 const int N=50001; 12 int n; 13 class FenwickTree { 14 private: 15 int val[N]; 16 int lowbit(const int x) { 17 return x&-x; 18 } 19 public: 20 FenwickTree() { 21 memset(val,0,sizeof
val); 22 } 23 void modify(int p) { 24 while(p<=n) { 25 val[p]++; 26 p+=lowbit(p); 27 } 28 } 29 int query(int p) { 30 int ans=0; 31 while(p) { 32 ans+=val[p];
33 p-=lowbit(p); 34 } 35 return ans; 36 } 37 }; 38 FenwickTree t[2]; 39 int main() { 40 n=getint(); 41 for(int m=getint(),cnt=0;m;m--) { 42 int op=getint(),l=getint(),r=getint(); 43 if(op==1) { 44 t[0].modify(n+1-l); 45 t[1].modify(r); 46 cnt++; 47 } 48 if(op==2) { 49 printf("%d\n",cnt-t[0].query(n-r)-t[1].query(l-1)); 50 } 51 } 52 return 0; 53 }

[TYVJ1473]校門外的樹3