1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include <iostream> #include <cstdio> using namespace std; const int MAX = 100005; int temp[MAX << 2],n,m,tree1[MAX << 2],tree2[MAX << 2];
void build (int cur,int l,int r); void ch (int cur,int l,int r,int x,int y); void pushdown (int cur); int query (int cur,int l,int r,int x,int y); int main () { scanf ("%d%d",&n,&m); build (1,1,n); for (int i = 1;i <= m;++i) { int type; scanf ("%d",&type); if (type == 0) { int x,y; scanf ("%d%d",&x,&y); ch (1,1,n,x,y); } else { int x,y; scanf ("%d%d",&x,&y); printf ("%d\n",query (1,1,n,x,y)); } } return 0; } void build (int cur,int l,int r) { if (l == r) { tree1[cur]++; return ; } int mid = (l + r) >> 1; build (cur << 1,l,mid);build (cur << 1 | 1,mid + 1,r); tree1[cur] = tree1[cur << 1] + tree1[cur << 1 | 1]; } void ch (int cur,int l,int r,int x,int y) { if (l >= x && r <= y) { temp[cur] ^= 1; swap (tree1[cur],tree2[cur]); return ; } int mid = (l + r) >> 1; pushdown (cur); if (x <= mid) ch (cur << 1,l,mid,x,y); if (y > mid) ch (cur << 1 | 1,mid + 1,r,x,y); tree1[cur] = tree1[cur << 1] + tree1[cur << 1 | 1]; tree2[cur] = tree2[cur << 1] + tree2[cur << 1 | 1]; } void pushdown (int cur) { if (temp[cur] == 0) return ; swap (tree1[cur << 1],tree2[cur << 1]); swap (tree1[cur << 1 | 1],tree2[cur << 1 | 1]); temp[cur << 1] ^= 1,temp[cur << 1 | 1] ^= 1; temp[cur] = 0; } int query (int cur,int l,int r,int x,int y) { if (l >= x && r <= y) return tree2[cur]; int mid = (l + r) >> 1; pushdown (cur); int ans = 0; if (x <= mid) ans += query (cur << 1,l,mid,x,y); if (y > mid) ans += query (cur << 1 | 1,mid + 1,r,x,y); return ans; }
|