Easy问题(CQOI)

来源:互联网 发布:牛贝微信淘宝客v6.74 编辑:程序博客网 时间:2024/05/17 08:47
Easy问题(重庆2006省选)
时间:1 秒  内存:64 MB  
50/100

题目描述

有一个n个元素的数组,每个元素初始均为0。有m条指令,要么让其中一段连续序列数字反转--0变1,1变0(操作1),要么询问某个元素的值(操作2)。 例如当n=20时,10条指令如下:

操作  回答     操作后的数组

1 1 10 N/A   11111111110000000000

2 6   1    11111111110000000000

2 12  0     11111111110000000000

1 5 12 N/A   11110000001100000000

2 6   0    11110000001100000000

2 15  0     11110000001100000000

1 6 16 N/A   11110111110011110000

1 11 17 N/A   11110111111100001000

2 12   1    11110111111100001000

2 6   1       11110111111100001000

输入

输入第一行包含两个整数n,m,表示数组的长度和指令的条数。以下m行,每行的第一个数t表示操作的种类。若t=1,则接下来有两个数L,R(L<=R),表示区间[L,R]的每个数均反转;若t=2,则接下来只有一个数I,表示询问的下标。

输出

输出中有多行.每个操作2输出一行(非0即1),表示每个操作2的回答。

样例输入

20 101 1 102 62 121 5 122 62 151 6 161 11 172 122 6

样例输出

100011

其它信息

50%的数据满足:1<=n<=1000, 1<=m<=10000。 100%的数据满足:1<=n<=100000, 1<=m<=500000。


#include<cstdio>
 
#define N 100002
 
intc[N],I,n,q,x,y;
 
intread()
{
    intx=0; bool f=0; char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if (ch=='-') f=1;
    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return(f)?-x:x;
}
 
voidad(int x,int w) {for(;x<=n;x=x+(x&-x)) c[x]=c[x]+w;}
 
intqy(int x) {int s=0;for(;x;x=x-(x&-x)) s=s+c[x];returns;}
 
intmain()
{
    for(n=read(),q=read();q;--q)
        if(read()==1) x=read(),y=read(),ad(x,1),ad(y+1,-1);
        else{x=read();if (qy(x)&1) puts("1");elseputs("0");}
    return0;
}

0 0
原创粉丝点击