/*
* @Author: hannibal
* @Date: 2018-08-07 10:42:26
* @Last Modified by: hannibal
* @Last Modified time: 2018-08-07 17:08:44
*/
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll mod = 10007;
const ll maxn = 1e5+10;
ll Case = 1, n, m;
struct node{
ll l, r;
ll add, mul, set;
ll p1, p2, p3;
ll mid(){
return (l+r)/2;}
}tr[maxn<<2];
void pushup(ll rt) {
tr[rt].p1 = (tr[rt<<1].p1 + tr[rt<<1|1].p1)%mod;
tr[rt].p2 = (tr[rt<<1].p2 + tr[rt<<1|1].p2)%mod;
tr[rt].p3 = (tr[rt<<1].p3 + tr[rt<<1|1].p3)%mod;
}
void caladd(ll rt) {
ll len1 = (tr[rt<<1].r-tr[rt<<1].l+1)%mod;
ll len2 =( tr[rt<<1|1].r-tr[rt<<1|1].l+1)%mod;
tr[rt<<1].add = (tr[rt<<1].add+tr[rt].add%mod);tr[rt<<1|1].add = (tr[rt<<1|1].add+tr[rt].add)%mod;
ll temp = (tr[rt].add*tr[rt].add%mod)*tr[rt].add%mod;
tr[rt<<1].p3 =(tr[rt<<1].p3+(temp*len1)%mod+3*tr[rt].add*((tr[rt<<1].p2+tr[rt<<1].p1*tr[rt].add)%mod)%mod)%mod;
tr[rt<<1|1].p3 = (tr[rt<<1|1].p3+(temp*len2)%mod+3*tr[rt].add*((tr[rt<<1|1].p2+tr[rt<<1|1].p1*tr[rt
线段树维护区间(平方和,立方和)修改区间(加,赋值,乘)
最新推荐文章于 2024-04-13 07:00:00 发布