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

Format
Input
第一行包含两个整数n,m,表示数组的长度和指令的条数,以下m行,每行的第一个数t表示操作的种类。若t=1,
则接下来有两个数L, R (L<=R),表示区间[L, R]的每个数均反转;若t=2,则接下来只有一个数I,表示询问的下 标。
1<=n<=100,000
1<=m<=500,000
Output
每个操作2输出一行(非0即1),表示每次操作2的回答
Samples
输入数据 1
20 10
1 1 10
2 6
2 12
1 5 12
2 6
2 15
1 6 16
1 11 17
2 12
2 6
输出数据 1
1
0
0
0
1
1
思路
直接线段树即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}#include<bits/stdc++.h>
using namespace std;
long long n,m,a[5000005],a2[5000005],u,x,y;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n+2){
a2[x]+=d;
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks+=a2[x];
x-=lb(x);
}
return lks;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u;
if(u==1){
cin>>x>>y;
ci(x+1,1);
ci(y+2,1);
}
else{
cin>>x;
cout<<co(x+1)%2<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号