【问题描述】
有一个n个元素的数组,每个元素初始均为0。有m条指令,要么让其中一段连续序列数字反转——0变1,1变0(操作1),要么询问某个元素的值(操作2)。
【解题报告】
区间统计。线段树或者树状数组。
前者裸的会超时2组(N=100000,m=500000),除非用不建树的线段树。
所以本菜果断用后者。
1 program easy;
2 var
3 ttt,t,n,m,x,y,i:longint;
4 c:array[1..100001]of longint;
5
6 procedure init;
7 begin
8 assign(input,'easy.in');
9 reset(input);
10 assign(output,'easy.out');
11 rewrite(output);
12 end;
13
14 procedure outit;
15 begin
16 close(input);
17 close(output);
18 halt;
19 end;
20
21 function lowbit(x:longint):longint;
22 begin
23 exit(x and (-x));
24 end;
25
26 procedure change(x:longint);
27 begin
28 while x>0 do
29 begin
30 inc(c[x]);
31 dec(x,lowbit(x));
32 end;
33 end;
34
35 function print(x:longint):longint;
36 var
37 tt:longint;
38 begin
39 tt:=0;
40 while x<=n do
41 begin
42 inc(tt,c[x]);
43 inc(x,lowbit(x));
44 end;
45 exit(tt);
46 end;
47
48 procedure main;
49 begin
50 ttt:=0;
51 fillchar(c,sizeof(c),0);
52 readln(n,m);
53 for i:=1 to m do
54 begin
55 read(t);
56 if t=1 then
57 begin
58 readln(x,y);
59 change(y);
60 change(x-1);
61 end
62 else
63 if t=2 then
64 begin
65 readln(x);
66 writeln(print(x) mod 2);
67 end;
68 end;
69 end;
70
71 begin
72 init;
73 main;
74 outit;
75 end.