这个博客记录2100到2400共17个题
#include
#include
using namespace std;
const int maxn = 2000010;
int A[maxn], B[maxn], N;
int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++) {
int x;
scanf("%d", &x);
A[x] = x;
}
for (int i = 1; i <= 2000000; i++) {
B[i] = max(A[i], B[i - 1]);
}
int ans = 0;
for (int i = 1; i <= 1000000; i++) {
if (A[i]) {
for (int j = 2 * i; j <= 2000000; j += i) ans = max(ans, B[j - 1] % i);
}
}
printf("%d\n", ans);
}
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 100010;
int N, T;
ll a[maxn];
struct node {
int l, r;
ll d, minimum, nums;
}tr[maxn * 4];
ll gcd(ll a, ll b) {
if (b == 0) return a;
return gcd(b, a % b);
}
void pushup(node& u, node& l, node& r) {
u.d = gcd(l.d, r.d);
if (l.minimum < r.minimum) {
u.minimum = l.minimum;
u.nums = l.nums;
}
else if (l.minimum > r.minimum) {
u.minimum = r.minimum;
u.nums = r.nums;
}
else {
u.minimum = l.minimum;
u.nums = l.nums + r.nums;
}
}
void pushup(int u) {
pushup(tr[u], tr[2 * u], tr[2 * u + 1]);
}
void build(int u, int l, int r) {
if (l == r) tr[u] = { l, r, a[l], a[l], 1 };
else {
tr[u].l = l, tr[u].r = r;
int mid = (l + r) / 2;
build(2 * u, l, mid), build(2 * u + 1, mid + 1, r);
pushup(u);
}
}
node query(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) return tr[u];
int mid = (tr[u].l + tr[u].r) / 2;
if (r <= mid) return query(2 * u, l, r);
else if (l > mid) return query(2 * u + 1, l, r);
else {
node left = query(2 * u, l, r);
node right = query(2 * u + 1, l, r);
node res;
pushup(res, left, right);
return res;
}
}
int main() {
scanf("%d", &N);
for (int i = 1; i <= N; i++) scanf("%lld", &a[i]);
build(1, 1, N);
scanf("%d", &T);
while (T--) {
int l, r;
scanf("%d%d", &l, &r);
node res = query(1, l, r);
if (res.d == res.minimum) {
printf("%lld\n", r - l + 1 - res.nums);
}
else {
printf("%d\n", r - l + 1);
}
}
return 0;
}
#include
#include
using namespace std;
typedef long long ll;
ll N, K, T, l1, l2, r1, r2;
int main() {
cin >> T;
while (T--) {
cin >> N >> K >> l1 >> r1 >> l2 >> r2;
ll ans = 1e18;
ll lmax = max(l1, l2), rmax = max(r1, r2), lmin = min(l1, l2), rmin = min(r1, r2);
K -= N * max(rmin - lmax, 0LL);
if (K <= 0) ans = 0;
else for (ll x = 1; x <= N; x++) {
ll res = x * max(lmax - rmin, 0LL), max_get = x * (rmax - lmin - max(rmin - lmax, 0LL));
if (max_get >= K) {
res += K;
}
else {
res += max_get + (K - max_get) * 2;
}
ans = min(ans, res);
}
cout << ans << endl;
}
}
#include
#include
using namespace std;
const int maxn = 100010;
int N, a[maxn];
typedef long long ll;
ll A, R, M;
ll f(ll x) {
ll lower = 0, upper = 0, res = 0;
for (int i = 1; i <= N; i++) {
if (a[i] > x) upper += a[i] - x;
else lower += x - a[i];
}
if (M < A + R) {
ll move = min(lower, upper);
res += M * move;
upper -= move, lower -= move;
}
res += A * lower + R * upper;
return res;
}
int main() {
cin >> N >> A >> R >> M;
for (int i = 1; i <= N; i++) cin >> a[i];
ll lb = 0, ub = 1e9 + 5;
while (ub - lb > 1) {
ll m1 = (lb + ub) / 2;
ll m2 = (m1 + ub) / 2;
ll f1 = f(m1), f2 = f(m2);
if (f1 > f2) lb = m1;
else ub = m2;
}
cout << min(f(lb), f(ub)) << endl;
return 0;
}
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1010;
int belong[maxn], N, K, sz[maxn], ans[maxn];
string result;
int query(vector<int>& v) {
printf("? %d", v.size());
for (auto u : v) {
printf(" %d", u);
}
printf("\n");
fflush(stdout);
int x;
cin >> x;
return x;
}
int main() {
int T;
cin >> T;
while (T--) {
cin >> N >> K;
vector<int> q;
memset(belong, 0, sizeof belong);
for (int i = 1; i <= K; i++) {
int C;
cin >> C;
sz[i] = C;
for (int j = 1; j <= C; j++) {
int idx;
cin >> idx;
belong[idx] = i;
}
}
for (int i = 1; i <= N; i++) q.push_back(i);
int mx = query(q);
int lb = 1, ub = N;
while (ub - lb >= 1) {
int mid = (lb + ub) / 2;
q.clear();
for (int i = 1; i <= mid; i++) q.push_back(i);
int xx = query(q);
if (xx < mx) lb = mid + 1;
else ub = mid;
}
int set_id = belong[lb];
for (int i = 1; i < set_id; i++) ans[i] = mx;
for (int i = set_id + 1; i <= K; i++) ans[i] = mx;
q.clear();
for (int i = 1; i <= N; i++) {
if (belong[i] != set_id) q.push_back(i);
}
ans[set_id] = query(q);
printf("! ");
for (int i = 1; i <= K; i++) {
printf("%d%c", ans[i], i == K ? '\n' : ' ');
}
fflush(stdout);
cin >> result;
if (result != "Correct") break;
}
return 0;
}
/*
3
4 2
2 1 3
2 2 4
4
2
3
3
Correct
2 2
1 1
1 2
2
1
1
Correct
3 2
1 1
2 2 3
3
2
3
1
Correct
*/
#include
#include
#include
using namespace std;
const int maxa = 1000010, maxn = 200010;
typedef long long ll;
struct query {
int l, r, id;
}Q[maxn];
//sum[i] 是当前查到的 i 这个数字有多少个。
ll a[maxn], sum[maxa], ans[maxn];
int N, T, block_size, L, R; //当前的左边界、右边界。
ll now; //当前的答案
bool cmp(query a, query b) {
if (a.l / block_size == b.l / block_size) return a.r < b.r;
return a.l / block_size < b.l / block_size;
}
void modify(int l, int r) {
//若当前 L 在 l 的左边
while (L < l) {
now -= (2 * sum[a[L]] - 1) * a[L];
sum[a[L]]--;
L++;
}
//若当前 L 在 l 的右边
while (L > l) {
L--;
now += (2 * sum[a[L]] + 1) * a[L];
sum[a[L]]++;
}
//若当前 R 在 r 的左边
while (R < r) {
R++;
now += (2 * sum[a[R]] + 1) * a[R];
sum[a[R]]++;
}
//若当前 R 在 r 的右边
while (R > r) {
now -= (2 * sum[a[R]] - 1) * a[R];
sum[a[R]]--;
R--;
}
}
int main() {
scanf("%d%d", &N, &T);
for (int i = 1; i <= N; i++) scanf("%I64d", &a[i]);
for (int i = 1; i <= T; i++) {
scanf("%d%d", &Q[i].l, &Q[i].r);
Q[i].id = i;
}
block_size = sqrt(N);
sort(Q + 1, Q + T + 1, cmp);
for (int i = 1; i <= T; i++) {
modify(Q[i].l, Q[i].r);
ans[Q[i].id] = now;
}
for (int i = 1; i <= T; i++) {
printf("%I64d\n", ans[i]);
}
return 0;
}
#include
#include
#include
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int maxn = 2010;
ll dp[maxn], fact[200010] = { 1 }, infact[200010] = { 1 };
typedef pair<int, int> P;
vector<P> black;
ll N, M, T;
ll mod_pow(ll x, ll n) {
ll res = 1;
while (n) {
if (n & 1) res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}
ll C(ll M, ll N) {
return fact[M] * infact[N] % mod * infact[M - N] % mod;
}
int main() {
cin >> N >> M >> T;
for (ll i = 1; i <= 200000; i++) {
fact[i] = fact[i - 1] * i % mod;
infact[i] = infact[i - 1] * mod_pow(i, mod - 2) % mod;
}
for (int i = 0; i < T; i++) {
int x, y;
cin >> x >> y;
black.push_back(P(x, y));
}
black.push_back(P(N, M));
sort(black.begin(), black.end());
for (int i = 0; i < black.size(); i++) {
int xi = black[i].first, yi = black[i].second;
dp[i] = C((ll)xi + yi - 2, (ll)xi - 1);
for (int j = 0; j < i; j++) {
int xj = black[j].first, yj = black[j].second;
if (yj > yi) continue;
dp[i] = (dp[i] - dp[j] * C((ll)xi + yi - xj - yj, (ll)xi - xj) % mod + mod) % mod;
}
}
cout << dp[T] << endl;
return 0;
}
#include
#include
using namespace std;
const int maxn = 500010;
int prime[maxn], st[maxn], cnt;
void sieve(int N) {
st[1] = 1;
for (int i = 2; i <= N; i++) {
if (!st[i]) prime[cnt++] = st[i] = i;
for (int j = 0; prime[j] <= N / i; j++) {
st[prime[j] * i] = prime[j];
if (i % prime[j] == 0) break;
}
}
}
int main() {
sieve(maxn - 1);
int N;
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
st[i] = i / st[i];
}
sort(st + 1, st + N + 1);
for (int i = 2; i <= N; i++) {
printf("%d%c", st[i], i == N ? '\n' : ' ');
}
return 0;
}
#include
#include
#include
using namespace std;
const int maxn = 100010;
typedef long long ll;
ll c[maxn], t[maxn], c_d[maxn], t_d[maxn];
unordered_map<ll, ll> c_map, t_map;
int N;
int main() {
scanf("%d", &N);
for (int i = 1; i <= N; i++) scanf("%lld", &c[i]);
for (int i = 1; i <= N; i++) scanf("%lld", &t[i]);
for (int i = 1; i <= N; i++) c_d[i] = c[i] - c[i - 1], t_d[i] = t[i] - t[i - 1];
for (int i = 1; i <= N; i++) c_map[c_d[i]]++, t_map[t_d[i]]++;
bool flag = (c[1] == t[1] && c[N] == t[N]);
for (auto p : c_map) {
int u = p.first, cnt = p.second;
if (t_map[u] != cnt) {
flag = false;
break;
}
}
if (flag) printf("Yes\n");
else printf("No\n");
return 0;
}
#include
#include
#include
#include
using namespace std;
const int maxn = 200010;
int N;
typedef long long ll;
ll a[maxn];
unordered_map<ll, ll> a_cnt;
int main() {
scanf("%d", &N);
for (int i = 1; i <= N; i++) scanf("%lld", &a[i]);
long double ans = 0;
for (int i = 1; i <= N; i++) {
ans += (ll)i * a[i] -((ll)N - (ll)i + 1LL) * a[i];
}
for (int i = 1; i <= N; i++) {
a_cnt[a[i]]++;
ll x = a_cnt[a[i] + 1], y = a_cnt[a[i] - 1];
ans = ans + x - y;
}
printf("%.Lf\n", ans);
return 0;
}
#include
#include
#include
using namespace std;
const int maxn = 100010;
typedef long long ll;
int N, M, a[maxn];
struct node {
int l, r;
ll sum, m;
}tr[maxn * 4];
void pushup(node& u, node& l, node& r) {
u.sum = l.sum + r.sum;
u.m = max(l.m, r.m);
}
void pushup(int u) {
pushup(tr[u], tr[2 * u], tr[2 * u + 1]);
}
void pushdown(int u) {
auto& root = tr[u], & left = tr[2 * u], & right = tr[2 * u + 1];
}
void build(int u, int l, int r) {
if (l == r) tr[u] = { l, r, a[l], a[l] };
else {
tr[u].l = l, tr[u].r = r;
int mid = (l + r) / 2;
build(2 * u, l, mid), build(2 * u + 1, mid + 1, r);
pushup(u);
}
}
node query(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) return tr[u];
int mid = (tr[u].l + tr[u].r) / 2;
if (r <= mid) return query(2 * u, l, r);
else if (l > mid) return query(2 * u + 1, l, r);
else {
node left = query(2 * u, l, r);
node right = query(2 * u + 1, l, r);
node res;
pushup(res, left, right);
return res;
}
}
void modify(int u, int x, ll d) {
if (tr[u].l == x && tr[u].r == x) tr[u] = { x, x, d, d};
else {
int mid = (tr[u].l + tr[u].r) / 2;
if (x <= mid) modify(2 * u, x, d);
else modify(2 * u + 1, x, d);
pushup(u);
}
}
void modify(int u, int l, int r, int x) {
if (tr[u].m < x) return;
if (tr[u].l == tr[u].r && tr[u].l >= l && tr[u].r <= r) {
tr[u].m %= x;
tr[u].sum = tr[u].m;
}
else {
int mid = (tr[u].l + tr[u].r) / 2;
if (l <= mid) modify(2 * u, l, r, x); //进入左区间
if (r > mid) modify(2 * u + 1, l, r, x); //进入右区间
//else modify(2 * u, l, r, x), modify(2 * u + 1, l, r, x); //进入两个区间
pushup(u);
}
}
int main() {
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++) scanf("%d", &a[i]);
build(1, 1, N);
while (M--) {
int op, l, r, x, k;
scanf("%d", &op);
if (op == 1) {
scanf("%d%d", &l, &r);
printf("%lld\n", query(1, l, r).sum);
}
else if (op == 2) {
scanf("%d%d%d", &l, &r, &x);
modify(1, l, r, x);
}
else {
scanf("%d%d", &k, &x);
modify(1, k, x);
}
}
return 0;
}
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 300010;
ll N, mod, K;
unordered_map<ll, ll> cnt;
ll mod_pow(ll x, ll n) {
ll res = 1;
while (n) {
if (n & 1) res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}
int main() {
scanf("%lld%lld%lld", &N, &mod, &K);
for (int i = 0; i < N; i++) {
ll x;
scanf("%lld", &x);
x = ((mod_pow(x, 4) - x * K) % mod + mod) % mod;
cnt[x]++;
}
ll ans = 0;
for (auto p : cnt) {
int u = p.second;
ans += u * (u - 1) / 2;
}
printf("%lld\n", ans);
return 0;
}
#include
#include
#include
using namespace std;
const int maxn = 100010;
typedef long long ll;
const ll mod = 1e9 + 7;
ll a[maxn];
int N, M;
const ll E[2][2] = { {1, 0}, {0, 1} };
struct node {
int l, r;
ll f[2], mul[2][2];
}tr[maxn * 4];
void mul(ll c[], ll a[], ll b[][2]) {
ll tmp[2] = { 0 };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
tmp[i] = (tmp[i] + a[j] * b[j][i]) % mod;
}
}
memcpy(c, tmp, sizeof tmp);
}
void mul(ll c[][2], ll a[][2], ll b[][2]) {
ll tmp[2][2] = { 0 };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % mod;
}
}
}
memcpy(c, tmp, sizeof tmp);
}
ll fib(ll n) {
ll f[2] = { 1, 1 };
ll a[2][2] = {
{0, 1},
{1, 1}
};
n -= 2;
/*if (n == 0) return 1;*/
while (n > 0) {
if (n & 1) mul(f, f, a);
mul(a, a, a);
n >>= 1;
}
return f[1];
}
void pushup(node& u, node& l, node& r) {
u.f[0] = (l.f[0] + r.f[0]) % mod;
u.f[1] = (l.f[1] + r.f[1]) % mod;
}
void pushup(int u) {
pushup(tr[u], tr[2 * u], tr[2 * u + 1]);
}
void build(int u, int l, int r) {
memcpy(tr[u].mul, E, sizeof E);
if (l == r) {
tr[u] = { l, l, fib(a[l]), fib(a[l] + 1) };
}
else {
tr[u].l = l, tr[u].r = r;
int mid = (l + r) / 2;
build(2 * u, l, mid), build(2 * u + 1, mid + 1, r);
pushup(u);
}
}
void eval(node& u, ll q[][2]) {
mul(u.f, u.f, q);
mul(u.mul, u.mul, q);
}
void pushdown(int u) {
eval(tr[2 * u], tr[u].mul);
eval(tr[2 * u + 1], tr[u].mul);
memcpy(tr[u].mul, E, sizeof E);
}
node query(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) return tr[u];
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
if (r <= mid) return query(2 * u, l, r);
else if (l > mid) return query(2 * u + 1, l, r);
else {
node left = query(2 * u, l, r);
node right = query(2 * u + 1, l, r);
node res;
pushup(res, left, right);
return res;
}
}
void modify(int u, int l, int r, ll q[][2]) {
if (l <= tr[u].l && tr[u].r <= r) {
eval(tr[u], q);
}
else {
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
if (l <= mid) modify(2 * u, l, r, q);
if (r > mid) modify(2 * u + 1, l, r, q);
pushup(u);
}
}
int main() {
//for (int i = 1; i <= 10; i++) printf("*** %lld\n", fib(i));
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++) scanf("%lld", &a[i]);
build(1, 1, N);
while (M--) {
int t, l, r;
ll x;
scanf("%d%d%d", &t, &l, &r);
if (t == 1) {
scanf("%lld", &x);
ll res[2][2];
memcpy(res, E, sizeof E);
ll multi[2][2]{
{0, 1},
{1, 1}
};
while (x) {
if (x & 1) mul(res, res, multi);
mul(multi, multi, multi);
x >>= 1;
}
modify(1, l, r, res);
}
else {
printf("%lld\n", query(1, l, r).f[0]);
}
}
return 0;
}
#include
#include
#include
#include
#include
using namespace std;
const int maxa = 500010, maxn = 200010;
int N, Q, a[maxn];
int prime[maxa], cnt, st[maxa];
void sieve(int N) {
st[1] = 1;
for (int i = 2; i <= N; i++) {
if (!st[i]) st[i] = prime[cnt++] = i;
for (int j = 0; prime[j] <= N / i; j++) {
st[prime[j] * i] = prime[j];
if (i % prime[j] == 0) break;
}
}
}
typedef unordered_map<int, int> um;
um now;
unordered_set<int> ss;
int divisor(int N, bool flag) {
int n = N;
vector<int> res;
int ans = ss.size();
while (N > 1) {
int x = st[N];
res.push_back(x);
while (N % x == 0) N /= x;
}
int sz = res.size();
for (int i = 1; i < (1 << sz); i++) {
int xx = 1, cnt = 0;
for (int j = 0; j < sz; j++) {
if ((i >> j) & 1) {
xx *= res[j];
cnt++;
}
}
if (cnt & 1) ans -= now[xx];
else ans += now[xx];
if (flag) now[xx]--;
else now[xx]++;
}
if (n == 1 && flag) return -ans + 1;
else if (flag) return -ans;
return ans;
}
typedef long long ll;
int main() {
scanf("%d%d", &N, &Q);
for (int i = 1; i <= N; i++) scanf("%d", &a[i]);
sieve(maxa - 1);
ll ans = 0;
while (Q--) {
int x;
scanf("%d", &x);
ans += divisor(a[x], ss.count(x));
if (ss.count(x)) ss.erase(x);
else ss.insert(x);
printf("%lld\n", ans);
}
return 0;
}
最后,我想说,线段树的题目真的难调!主要还是思路上面不是很完整,有漏洞。
#include
#include
#include
using namespace std;
const int maxn = 300010;
typedef long long ll;
const ll mod = 1e9 + 9;
ll fib[maxn] = { 1, 1, 1 };
ll a[maxn];
struct node {
int l, r;
ll sum, f1, f2;
}tr[maxn * 4];
void pushup(node& u, node& l, node& r) {
u.sum = (l.sum + r.sum) % mod;
}
void pushup(int u) {
pushup(tr[u], tr[2 * u], tr[2 * u + 1]);
}
ll getFib(int n, ll a, ll b) {
if (n == 1) return a % mod;
if (n == 2) return b % mod;
return (a % mod * fib[n - 2] % mod + b % mod * fib[n - 1] % mod) % mod;
}
ll sum(int n, ll f1, ll f2) {
return ((getFib(n + 2, f1, f2) - f2) % mod + mod) % mod;
}
//void eval(int u) {
// tr[u].sum = sum(tr[u].r - tr[u].l + 1, tr[u].f1, tr[u].f2);
//}
void pushdown(int u) {
ll f1 = tr[u].f1, f2 = tr[u].f2;
node& root = tr[u], & left = tr[2 * u], & right = tr[2 * u + 1];
if (f1 == 0) return;
left.f1 = (left.f1 + f1) % mod, left.f2 = (left.f2 + f2) % mod;
right.f1 = (right.f1 + getFib(right.l - root.l + 1, f1, f2)) % mod;
right.f2 = (right.f2 + getFib(right.l - root.l + 2, f1, f2)) % mod;
tr[2 * u].sum += sum(left.r - left.l + 1, f1, f2);
tr[2 * u].sum %= mod;
ll x = getFib(right.l - root.l + 1, f1, f2);
ll y = getFib(right.l - root.l + 2, f1, f2);
tr[2 * u + 1].sum += sum(right.r - right.l + 1, x, y);
tr[2 * u + 1].sum %= mod;
tr[u].f1 = tr[u].f2 = 0;
}
void build(int u, int l, int r) {
if (l == r) tr[u] = { l, r, 0, 0, 0 };
else {
tr[u] = { l, r, 0, 0, 0 };
int mid = (l + r) / 2;
build(2 * u, l, mid), build(2 * u + 1, mid + 1, r);
pushup(u);
}
}
void modify(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) {
//printf("$$$ %d %d %lld %lld %lld\n", tr[u].l, tr[u].r, tr[u].f1, tr[u].f2, tr[u].sum);
tr[u].f1 = (tr[u].f1 + fib[tr[u].l - l + 1]) % mod;
tr[u].f2 = (tr[u].f2 + fib[tr[u].l - l + 2]) % mod;
tr[u].sum += sum(tr[u].r - tr[u].l + 1, fib[tr[u].l - l + 1], fib[tr[u].l - l + 2]);
tr[u].sum %= mod;
//printf("### %d %d %lld %lld %lld\n", tr[u].l, tr[u].r, tr[u].f1, tr[u].f2, tr[u].sum);
}
else {
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
if (l <= mid) modify(2 * u, l, r);
if (r > mid) modify(2 * u + 1, l, r);
pushup(u);
}
}
node query(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) return tr[u];
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
if (r <= mid) return query(2 * u, l, r);
else if (l > mid) return query(2 * u + 1, l, r);
else {
node left = query(2 * u, l, r);
node right = query(2 * u + 1, l, r);
node res;
pushup(res, left, right);
return res;
}
}
int main() {
for (int i = 3; i < maxn; i++) fib[i] = (fib[i - 1] + fib[i - 2]) % mod;
int N, M;
scanf("%d%d", &N, &M);
build(1, 1, N);
for (int i = 1; i <= N; i++) scanf("%lld", &a[i]);
for (int i = 1; i <= N; i++) a[i] = (a[i] + a[i - 1]) % mod;
//printf("&$ %lld\n", a[N]);
while (M--) {
int t, l, r;
scanf("%d%d%d", &t, &l, &r);
if (t == 1) {
modify(1, l, r);
}
else {
ll ans = (((query(1, l, r).sum + a[r] - a[l - 1]) % mod) + mod) % mod;
printf("%lld\n", ans);
}
//for (int i = 1; i <= N; i++) {
// ll ans = query(1, i, i).sum + a[i] - a[i - 1];
// printf("*** %lld %lld %lld %lld\n", ans, query(1, i, i).f1, query(1, i, i).f2, query(1, i, i).sum);
//}
//printf("\n");
}
return 0;
}
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 300010;
ll a[maxn];
int N, L;
int main(){
scanf("%d%d", &N, &L);
for (int i = 0; i < N; i++)
scanf("%lld", &a[i]);
sort(a, a + N);
ll ans = (ll)N * ((ll)N - 1LL) * ((ll)N - 2LL) / 6LL;
for (int i = 0; i < N; i++){
int u = a[i] + L / 2;
ll cnt;
if (u < L) {
int lb = 0, ub = N;
while (ub - lb > 1) {
int mid = (ub + lb) / 2;
if (a[mid] <= u) lb = mid;
else ub = mid;
}
if ((a[lb] - a[i]) * 2 == L) lb--;
//printf("*** %d\n", lb);
cnt = lb - i;
//printf("### %d\n", cnt);
}
else {
u %= L;
int lb = 0, ub = N;
while (ub - lb > 1) {
int mid = (ub + lb) / 2;
if (a[mid] <= u) lb = mid;
else ub = mid;
}
if ((a[i] - a[lb]) * 2 == L) lb--;
//printf("*** %d\n", lb);
cnt = N - (i - lb);
if (u < a[0]) cnt--;
}
ans -= (cnt - 1) * cnt / 2;
}
printf("%lld\n", ans);
return 0;
}
/*
4 10
0 2 3 4
4 10
0 2 3 5
3 10
0 5 6
3 7
0 4 5
*/