求救玄关
查看原帖
求救玄关
464004
ZepX_D楼主2024/11/12 20:33

拼尽全力无法战胜

#include <bits/stdc++.h>
#define fr first
#define se second
#define Un unsigned
#define LL long long
#define pb push_back
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define __ __int128
#define LD long double
#define VE vector<LL>
#define DB double
#define Ve vector<int>

using namespace std;

inline LL read()
{
	LL x = 0,f = 1;char ch = getchar();
	while(!isdigit(ch)) (ch == '-') && (f = -1),ch = getchar();
	while(isdigit(ch)) x = x*10+ch-48,ch = getchar();
	return x*f;
}

const int P = 1e9+7,N = 5e5+5;

struct tree{int l,r;LD mx,mul;LL sum,smx;}tr[N<<2];
LL x[N],y[N];

inline void pushup(int i)
{
	if (tr[i<<1].mx < tr[i<<1].mul+tr[i<<1|1].mx) tr[i].mx = tr[i<<1].mul+tr[i<<1|1].mx,tr[i].smx = tr[i<<1].sum*tr[i<<1|1].smx%P;
	else tr[i].mx = tr[i<<1].mx,tr[i].smx = tr[i<<1].smx;
	tr[i].sum = tr[i<<1].sum*tr[i<<1|1].sum%P;
	tr[i].mul = tr[i<<1].mul+tr[i<<1|1].mul;
}

void build(int l,int r,int i)
{
	tr[i].l = l,tr[i].r = r;
	if (l == r) return (void)(tr[i].mul = logl(tr[i].sum = x[l]),tr[i].mx = logl(x[l]*y[l]),tr[i].smx = x[l]*y[l]%P);
	int mid = (l+r)>>1;
	build(l,mid,i<<1),build(mid+1,r,i<<1|1);
	pushup(i);
}

void M1(int p,int k,int i)
{
	if (tr[i].l == tr[i].r) return (void)(tr[i].mul = logl(tr[i].sum = k));
	if (p <= tr[i<<1].r) M1(p,k,i<<1);
	else M1(p,k,i<<1|1);
	pushup(i);
}

void M2(int p,int k,int i)
{
	if (tr[i].l == tr[i].r)	return (void)(tr[i].mx = logl(tr[i].sum*k),tr[i].smx = tr[i].sum*k%P);
	if (p <= tr[i<<1].r) M2(p,k,i<<1);
	else M2(p,k,i<<1|1);
	pushup(i);
}

int main()
{
	int n = read();
	for (int i = 0;i < n;i++) x[i] = read();
	for (int i = 0;i < n;i++) y[i] = read();
	build(0,n-1,1);
	printf("%lld\n",tr[1].smx);
	int m = read();
	while (m--)
	{
		int op = read(),pos = read(),val = read();
		if (op == 1) M1(pos,val,1);
		else M2(pos,val,1);
		printf("%lld\n",tr[1].smx);
	}
	return 0;
}
2024/11/12 20:33
加载中...