怎么这也能re啊
  • 板块学术版
  • 楼主0tAp
  • 当前回复6
  • 已保存回复7
  • 发布时间2024/9/12 06:00
  • 上次更新2024/9/12 17:18:06
查看原帖
怎么这也能re啊
758858
0tAp楼主2024/9/12 06:00
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define xx return 
#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i++)
const int N=5e5;

int n,m,q;
int a[N+5];

struct Tree{
	int left,right,up;
	#define left(x) t[x].left
	#define right(x) t[x].right
	#define up(x) t[x].up
}t[N*4+5];

Tree operator + (Tree a,Tree b)
{
	Tree res;
	res.up=(a.up>>b.right)<<b.left|b.up;
	res.left=b.left+max(a.left-b.right,0ll);
	res.right=a.right+max(b.right-a.left,0ll);
	xx res;
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		if(a[l]==1)t[p]=Tree{1,0,0};
		else if(a[l]==2)t[p]=Tree{1,0,1};
		else t[p]=Tree{0,1,0};
		xx;
	}
	int mid=l+r>>1;
	build(p*2,l,mid),build(p*2+1,mid+1,r);
	t[p]=t[p*2]+t[p*2+1];
}

void change(int p,int l,int r,int x,int val)
{
	if(l==r)
	{
		if(val==1)t[p]=Tree{1,0,0};
		else if(val==2)t[p]=Tree{1,0,1};
		else t[p]=Tree{0,1,0};
		xx;
	}
	int mid=l+r>>1;
	if(x<=mid)change(p*2,l,mid,x,val);
	if(x>mid)change(p*2+1,mid+1,r,x,val);
	t[p]=t[p*2]+t[p*2+1];
}

Tree ask(int p,int l,int r,int L,int R,Tree &k)
{
	if(L<=l&&r<=R)xx (k=k+t[p]);
	int mid=l+r>>1;
	if(L<=mid)ask(p*2,l,mid,L,R,k);
	if(mid<R)ask(p*2+1,mid+1,r,L,R,k);
	t[p]=t[p*2]+t[p*2+1];
}

void solve()
{
	scanf("%lld%lld%lld",&n,&m,&q);
	rep(i,1,m)scanf("%lld",&a[i]);
	build(1,1,m);
	while(q--)
	{
		int op;scanf("%lld",&op);
		if(op==1){
			int s,l,r;scanf("%lld%lld%lld",&s,&l,&r);
			Tree k=Tree{0,0,0};
			ask(1,1,m,l,r,k);
			printf("%lld\n",(1ll,max(1ll,(s>>k.right))<<k.left|k.up));
		}
		else {
			int x,y;scanf("%lld%lld",&x,&y);
			change(1,1,m,x,y);
		}
	}
	xx;
}

signed main()
{
	solve();
	xx 0;
}

调半天没调出来,一直re,求大佬帮调一下: (

2024/9/12 06:00
加载中...