luogu P5057 [CQOI2006]简单题

luogu P5057 [CQOI2006]简单题
一个线段树
提供一个新的思路:
对于操作一:给l,r之间所有数+1
对于操作二:看作询问a[x]的奇偶性
奇数输出1
偶数输出0
就成一个模板题了
std:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define LB l,mid,num<<1
#define RB mid+1,r,num<<1|1
const int N=100005;
int n,m;
ll a[N];
ll t[4*N]={0};
ll laz[4*N]={0};
void pushup(int num,int u)
{
 if(laz[num]!=0)
 {
  laz[num<<1]+=laz[num];
  laz[num<<1|1]+=laz[num];
  t[num<<1|1]+=(ll)(u>>1)*laz[num];
  t[num<<1]+=(ll)(u-(u>>1))*laz[num];
  laz[num]=0;
 }
}
void build(int l,int r,int num)
{
 if(l==r)
 {
  t[num]=a[l];
  return;
 }
 int mid=(l+r)>>1;
 build(LB);
 build(RB);
 t[num]=t[num<<1]+t[num<<1|1];
}
void update(int l,int r,int num,int L,int R,ll SUM)
{
 if(L<=l&&R>=r)
 {
  laz[num]+=SUM;
  t[num]+=SUM*(r-l+1);
  return;
 }
 pushup(num,(r-l+1));
 int mid=(l+r)>>1;
 if(L<=mid) update(LB,L,R,SUM);
 if(R>mid) update(RB,L,R,SUM);
 t[num]=t[num<<1]+t[num<<1|1];
}
ll serch(int l,int r,int num,int L,int R)
{
 
 if(L<=l&&R>=r)
 {
  return t[num];
 }
 pushup(num,(r-l+1));
 int mid=(l+r)>>1;
 ll rep=0; 
 if(L<=mid) rep+=serch(LB,L,R);
 if(R>mid) rep+=serch(RB,L,R);
 return rep; 
}
int main()
{
 scanf("%d%d",&n,&m);
 for(int i=1;i<=n;i++)
  a[i]=0; 
 build(1,n,1);
 for(int i=1;i<=m;i++)
 {
  int x;
  scanf("%d",&x);
  if(x==1)
  {
   int l,r;
   scanf("%d %d",&l,&r);
   update(1,n,1,l,r,1); 
  }
  else
  {
   int l;
   scanf("%d",&l);
   ll ans=serch(1,n,1,l,l);
   if(ans%2==1) printf("1\n");
   else printf("0\n");
  }
 }
 return 0;
}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值