WA10分求助
查看原帖
WA10分求助
271096
Semorius楼主2021/11/15 19:01
#include <bits/stdc++.h>
using namespace std;
const long long SIZE = 100005;
const long long mod = 1e9+7;
long long n, m;
long long a[SIZE];

inline long long rd(){
	long long f = 1, x = 0;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-') f = -1;
		ch = getchar();
	}	
	while(isdigit(ch)){
		x = x * 10 + (ch - '0');
		ch = getchar();
	}
	return f*x;
}

struct Tree{
	long long l, r;
	long long sum, sum_2;
}t[SIZE*4];

long long power(long long x, long long y){
	long long num = 1ll;
	while(y){
		if(y & 1) num = num * x % mod;
		x = x * x % mod;
		y >>= 1;
	}
	return num % mod;
}

void pushup(long long p){
	t[p].sum = (t[p<<1].sum + t[p<<1|1].sum) % mod;
	t[p].sum_2 = (t[p<<1].sum_2 + t[p<<1|1].sum_2) % mod;
}

void Build(long long p, long long l, long long r){
	t[p].l = l, t[p].r = r;
	if(l == r){
		t[l].sum = a[l];
		t[l].sum_2 = (a[l] * a[l]) % mod;
		return;
	}	
	long long mid = (l+r) / 2;
	Build(p<<1, l, mid);
	Build(p<<1|1, mid+1, r);
	pushup(p);
}

void change(long long p, long long x, long long val){
	if(t[p].l == t[p].r){
		t[p].sum = val;
		t[p].sum_2 = (val*val) % mod;
		return;
	}	
	long long mid = (t[p].l + t[p].r) / 2;
	if(x <= mid) change(p<<1, x, val);
	else change(p<<1|1, x, val);
	pushup(p);
}

long long ask1(long long p, long long l, long long r){
	if(l <= t[p].l && r >= t[p].r) return t[p].sum;
	long long mid = (t[p].l + t[p].r) / 2;
	long long jl = 0;
	if(l <= mid) jl += ask1(p<<1, l, r), jl %= mod;
	if(r > mid) jl += ask1(p<<1|1, l, r), jl %= mod;
	return jl % mod;	
}

long long ask2(long long p, long long l, long long r){
	if(l <= t[p].l && r >= t[p].r) return t[p].sum_2;
	long long mid = (t[p].l + t[p].r) / 2;
	long long jl = 0;
	if(l <= mid) jl += ask2(p<<1, l, r), jl %= mod;
	if(r > mid) jl += ask2(p<<1|1, l, r), jl %= mod;
	return jl % mod;	
}

int main(){
	n = rd(); m = rd();
	for(long long i = 1; i <= n; i++) a[i] = rd() % mod;
	Build(1, 1, n);
	for(long long i = 1; i <= m; i++){
		long long c = rd(), x = rd(), y = rd();
		if(c == 1){
			y %= mod;
			change(1, x, y);
		}
		else{
			long long sum1 = ask1(1, x, y);
			long long sum2 = ask2(1, x, y);
			long long jl = power(y-x+1, mod-2);
			printf("%lld\n", ((((sum2*jl)%mod) - ((power(sum1, 2) * power(jl, 2)) % mod))%mod+mod)%mod); 
		}
	}
	return 0;
}
2021/11/15 19:01
加载中...