线段树模板求调
查看原帖
线段树模板求调
379113
dtrthg楼主2022/8/20 15:24

半个下午了,线段树真*****耗寿命(来自菜狗的哀嚎)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define ll long long
const int Maxn=1e5+10;
int tree[Maxn<<2],lazy[Maxn<<2];
int x,y;
int a;
int ans;
void pushDown(int l,int r,int p)
{
	int mid=(l+r)>>1,le=p<<1,ri=p<<1|1;
	tree[le]+=lazy[p]*(mid-l+1);
    lazy[le]+=lazy[p];
    tree[ri]+=lazy[p]*(r-mid);
    lazy[ri]+=lazy[p];
    lazy[p]=0;
}
void build(int l,int r,int p)
{
	if(l==r)
	{
		tree[p]=0;
		return ;
	}
	ll mid=(l+r)>>1,le=p<<1,ri=p<<1|1;
	build(l,mid,le);
	build(mid+1,r,ri);
	tree[p]=tree[le]+tree[ri];
}
void update(int l,int r,int p)
{
	if(x<=l&&r<=y)
	{
		tree[p]+=(r-l+1);
		lazy[p]++;
		return ;
	}
	pushDown(l,r,p);
	ll mid=(l+r)>>1,le=p<<1,ri=p<<1|1;
	if(x<=mid) update(l,mid,le);
	if(y>mid) update(mid+1,r,ri);
	tree[p]=tree[le]+tree[ri];
}
ll query(int l,int r,int p)
{
	if(l==r) return tree[p]&=1;
	pushDown(l,r,p);
	ll mid=(l+r)>>1,le=p<<1,ri=p<<1|1;
	if(x<=mid) return query(l,mid,le);
	return query(mid+1,r,ri);
}
int main()
{
	int n,m;cin>>n>>m;
	//init
	build(1,n,1);
	//½¨Ê÷
    while(m--)
    {
    	int t;cin>>t;
    	if(t==1)
    	{
    		cin>>x>>y;
    		update(1,n,1);
		}
		if(t==2)
		{
			cin>>a;
			cout<<query(1,n,1)<<endl;
		}
	}
    
	//´¦Àí 
    return 0;
}
/*
in1:
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
out1:
1
0
0
0
1
1
*/
2022/8/20 15:24
加载中...