MnZn刚学势能线段数树0.114514s,求助95ptsTLE,悬赏八关住
查看原帖
MnZn刚学势能线段数树0.114514s,求助95ptsTLE,悬赏八关住
529038
Butterfly__qwq楼主2023/10/17 13:48

错的是#3

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200005,mod=998244353;
int a[N];
int qpow(int a,int x,int p)
{
	if(x==0)return 1;
	if(x==1)return a;
	int c=qpow(a,x/2,p),y=qpow(a,x%2,p);
	return c*y%p*c%p;
}
struct node
{
	int sum,mx,quat,mqua,lazy;
}sg[N<<2];
void pushup(int u)
{
	sg[u].sum=sg[u<<1].sum+sg[u<<1|1].sum;
	sg[u].mx=max(sg[u<<1].sum,sg[u<<1|1].sum);
	sg[u].mqua=min(sg[u<<1].mqua,sg[u<<1|1].mqua);
}
void pushlazy(int u,int lz)
{
	sg[u].quat+=lz;
	sg[u].mqua+=lz;
	sg[u].lazy+=lz;
}
void pushdown(int u)
{
	if(sg[u].lazy)
	{
		pushlazy(u<<1,sg[u].lazy);
		pushlazy(u<<1|1,sg[u].lazy);
		sg[u].lazy=0;
	}
}
void build(int u,int l,int r)
{
	if(l==r)
	{
		sg[u].mx=sg[u].sum=a[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void update(int u,int l,int r,int L,int R)
{
	if(L<=l&&r<=R&&sg[u].mqua)
	{
		pushlazy(u,-1);
		return;
	}
	if(l==r)
	{
		if(sg[u].mqua)pushlazy(u,-1);
		else
		{
			sg[u].sum=sqrt(sg[u].sum);
			sg[u].mx=sqrt(sg[u].mx);
		}
		return;
	}
	pushdown(u);
	int mid=l+r>>1;
	if(L<=mid&&sg[u<<1].mx>1)update(u<<1,l,mid,L,R);
	if(R>mid&&sg[u<<1|1].mx>1)update(u<<1|1,mid+1,r,L,R);
	pushup(u);
}
void modify(int u,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)
	{
		pushlazy(u,1);
		return;
	}
	pushdown(u);
	int mid=l+r>>1;
	if(L<=mid)modify(u<<1,l,mid,L,R);
	if(R>mid)modify(u<<1|1,mid+1,r,L,R);
	pushup(u);
}
int query(int u,int l,int r,int i)
{
	if(l==r)return qpow(sg[u].sum,qpow(2,sg[u].quat,mod-1),mod);
	pushdown(u);
	int mid=l+r>>1;
	if(i<=mid)return query(u<<1,l,mid,i);
	return query(u<<1|1,mid+1,r,i);
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int n,m,ans=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1)update(1,1,n,l,r);
		if(op==2)modify(1,1,n,l,r);
	}
	for(int i=1;i<=n;i++)(ans+=query(1,1,n,i))%=mod;
	cout<<ans;
}
2023/10/17 13:48
加载中...