呜呜 写了7.5h了还是不知道哪里挂了,对拍出来只有很大的数据才有时会挂掉,有神仙帮忙看看吗/kel
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
register int x=0;register char ch=getchar();
while(ch<48)ch=getchar();
while(ch>=48)x=x*10+(ch^48),ch=getchar();
return x;
}
int n, m, a[1000010], c[1000010], block[1000010], re[1000010], sq;
int mul[1000100], mulb[1000010], tag[1000010], f[1000010], p = 1e9 + 7;
int power[1000010];
struct node{
int val, pos;
bool operator < (const node a) const
{
return val < a.val;
}
}b[1000010];
void pushdown(int i){for(int j = (i - 1) * sq + 1;j <= i * sq;j ++)c[j] = tag[i];}
void brush(int i)
{
if(tag[i] != -1)pushdown(i);
tag[i] = -1;
sort(b + (i - 1) * sq + 1, b + min(n, i * sq) + 1);
mul[i] = 1;
mulb[(i - 1) * sq + 1] = b[(i - 1) * sq + 1].val;
f[i] = (i - 1) * sq + 1;
re[b[(i - 1) * sq + 1].pos] = (i - 1) * sq + 1;
for(int j = (i - 1) * sq + 2;j <= min(n, i * sq);j ++)
{
mulb[j] = mulb[j - 1] * b[j].val % p;
re[b[j].pos] = j;
}
for(int j = (i - 1) * sq + 1;j <= min(n, i * sq);j ++)
{
mul[i] = mul[i] * min(c[j], b[re[j]].val) % p;
}
}
int Bfind(int x, int bl)
{
for(;f[bl] <= min(bl * sq, n);f[bl] ++)if(b[f[bl]].val >= x)break;
return f[bl] - 1;
}
int updateA(int pos, int val)
{
power[0] = 1;
for(int i = 1;i <= sq * 2;i ++)power[i] = power[i - 1] * val % p;
a[pos] = val;
int bl = block[pos], br = block[pos];
for(;br <= block[n];br ++)if(tag[br] >= val or c[min(br * sq, n)] >= val)break;
br = min(br, block[n]);
if(tag[br] >= val)br --;
pushdown(bl);
pushdown(br);
for(int i = pos;i <= min(bl * sq, n);i ++)c[i] = max(c[i], val);
for(int i = (br - 1) * sq + 1;i <= min(br * sq, n);i ++)c[i] = max(c[i], val);
brush(bl);
brush(br);
for(int i = bl + 1; i <= br - 1;i ++)
{
tag[i] = val;
int lef = Bfind(val, i);
mul[i] = mulb[lef] * power[i * sq - lef] % p;//l + 1 -- i * sq
}
int res = 1;
for(int i = 1;i <= block[n];i ++)res = res * mul[i] % p;
return (res + p) % p;
}
int updateB(int pos, int val)
{
int res = 1;
b[re[pos]].val = val;
brush(block[pos]);
for(int i = 1;i <= block[n];i ++)res = res * mul[i] % p;
return (res + p) % p;
}
signed main()
{
freopen("data.in","r",stdin);
freopen("q1.out","w",stdout);
n = read();
m = read();
sq = sqrt(n);
for(int i = 1;i <= n;i ++)
{
a[i] = read();
c[i] = max(a[i], c[i - 1]);
block[i] = (i - 1) / sq + 1;
}
for(int i = 1;i <= n;i ++)
{
b[i] = node{read(), i};
}
for(int i = 1;i <= block[n];i ++)
{
f[i] = (i - 1) * sq + 1;
mul[i] = 1;
sort(b + (i - 1) * sq + 1, b + min(n, i * sq) + 1);
mulb[(i - 1) * sq + 1] = b[(i - 1) * sq + 1].val;
tag[i] = -1;
re[b[(i - 1) * sq + 1].pos] = (i - 1) * sq + 1;
for(int j = (i - 1) * sq + 2;j <= min(n, i * sq);j ++)
{
mulb[j] = mulb[j - 1] * b[j].val % p;
re[b[j].pos] = j;
}
for(int j = (i - 1) * sq + 1;j <= min(n, i * sq);j ++)
{
mul[i] = mul[i] * min(c[j], b[re[j]].val) % p;
}
}
for(int i = 1;i <= m;i ++)
{
int op = read(), x = read(), y = read();
if(op == 0)cout<<updateA(x, y)<<'\n';
if(op == 1)cout<<updateB(x, y)<<'\n';
}
return 0;
}
如果有神仙帮我调出来的话 如果复赛有人带女装 我就去女装