基础
模类
constexpr int P = 1000000007;
// assume -P <= x < 2P
int norm(int x) { if (x < 0) x += P; else if (x >= P) x -= P; return x; }
// 快速幂
template <class T> T power(T a, int b) { T res = 1; for (; b; b /= 2, a *= a) { if (b % 2) { res *= a; } } return res; }
struct Mint {
int x;
Mint(int x = 0) : x(norm(x)) {}
int val() const { return x; }
Mint operator-() const { return Mint(norm(P - x)); }
Mint inv() const { assert(x != 0); return power(*this, P - 2); }
Mint &operator*=(const Mint &rhs) { x = ll(x) * rhs.x % P; return *this; }
Mint &operator+=(const Mint &rhs) { x = norm(x + rhs.x); return *this; }
Mint &operator-=(const Mint &rhs) { x = norm(x - rhs.x); return *this; }
Mint &operator/=(const Mint &rhs) { return *this *= rhs.inv(); }
friend Mint operator*(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res *= rhs; return res; }
friend Mint operator+(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res += rhs; return res; }
friend Mint operator-(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res -= rhs; return res; }
friend Mint operator/(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res /= rhs; return res; }
};
// 阶乘和逆元
Mint fac[N], inv[N];
inline Mint C(int A, int B){ return fac[A] * inv[B] * inv[A - B]; }
/*** main ***/
n = N - 1;
fac[0] = 1;
rep(i,1,n) fac[i] = fac[i-1] * i;
inv[n] = fac[n].inv();
per(i,n-1,0) inv[i] = inv[i+1] * (i + 1);
/*** endmain ***/
数据结构
树状数组
template <typename T>
struct Fenwick {
const int n;
vector<T> a;
Fenwick(int n): n(n), a(n + 1) {}
void add(int x, T v){
for(int i = x; i <= n; i += i & -i) a[i] += v;
}
T sum(int x) {
T rs = 0;
for(int i = x; i; i -= i & -i) {
rs += a[i];
}
return rs;
}
T rangeSum(int l, int r) {
if(l > r) return 0;
return sum(r) - sum(l - 1);
}
};
线段树
http://oj.daimayuan.top/problem/813
#include<bits/stdc++.h>
using namespace std;
#define dbg(x...) do { cout << "\033[32;1m" << #x <<" -> "; err(x); } while (0)
void err() { cout << "\033[39;0m" << endl; }
template<class T, class... Ts> void err(const T& arg,const Ts&... args) { cout << arg << " "; err(args...); }
#define rep(i,j,k) for(int i=int(j);i<=int(k);i++)
#define per(i,j,k) for(int i=int(j);i>=int(k);i--)
typedef long long ll;
const int inf = 1E9;
template<class Info, class Merge = plus<Info>>
struct SegTree{
const int n;
const Merge merge;
vector<Info> info;
SegTree(int n): n(n), merge(Merge()), info(4 * n) {}
SegTree(int n, vector<Info>& init): SegTree(n) {
function<void(int,int,int)> build = [&](int p, int l, int r) {
if(l == r) {
info[p] = init[l];
return;
}
int m = (l + r) / 2;
build(2 * p, l, m);
build(2 * p + 1, m + 1, r);
pull(p);
};
build(1, 1, n);
}
void pull(int p) {
info[p] = merge(info[2 * p], info[2 * p + 1]);
}
void modify(int p, int l, int r, int x, const Info &v) {
if(l == r) {
info[p] = v;
return;
}
int m = (l + r) / 2;
if(x <= m) modify(p * 2, l, m, x, v);
else modify(2 * p + 1, m + 1, r, x, v);
pull(p);
}
void modify(int p, const Info &v) {
modify(1, 1, n, p, v);
}
Info rangeQuery(int p, int l, int r, int x, int y) {
if(l > y || r < x) {
return Info();
}
if(l >= x && r <= y) return info[p];
int m = (l + r) / 2;
return merge(rangeQuery(p * 2, l, m, x, y), rangeQuery(p * 2 + 1, m + 1, r, x, y));
}
Info rangeQuery(int l, int r) {
return rangeQuery(1, 1, n, l, r);
}
};
// 创建结点信息、*运算
struct Node {
int ls, rs, mx, sum;
Node() {
Node(-inf);
sum = 0;
}
Node(int val):ls(val),rs(val),mx(val),sum(val){}
};
Node operator * (const Node &l, const Node &r) {
Node t;
t.sum = l.sum + r.sum;
t.mx = max(l.rs + r.ls, max(l.mx, r.mx));
t.ls = max(l.ls, l.sum + r.ls);
t.rs = max(r.rs, r.sum + l.rs);
return t;
}
struct Mul {
Node operator () (const Node &l, const Node &r) const {
return l * r;
}
};
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<Node> a(n + 1);
rep(i,1,n) {
int x; cin >> x;
a[i] = Node(x);
}
SegTree<Node, Mul> seg(n, a);
while (m--)
{
int o, x, y;
cin >> o >> x >> y;
if(o == 1) {
if(x > y) swap(x, y);
cout << seg.rangeQuery(x, y).mx << endl;
} else {
seg.modify(x, Node(y));
}
}
return 0;
}