Skip to content

Commit

Permalink
seg changes
Browse files Browse the repository at this point in the history
  • Loading branch information
EMachad0 committed Aug 28, 2024
1 parent b013066 commit b8e6cbc
Show file tree
Hide file tree
Showing 13 changed files with 111 additions and 301 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@ const int MAX = 2505;

int n, m, mat[MAX][MAX], tree[4 * MAX][4 * MAX];

int le(int x) { return 2 * x + 1; }
int ri(int x) { return 2 * x + 2; }
int lc(int x) { return 2 * x + 1; }
int rc(int x) { return 2 * x + 2; }

void build_y(int nx, int lx, int rx, int ny, int ly, int ry) {
if (ly == ry) {
if (lx == rx) tree[nx][ny] = mat[lx][ly];
else tree[nx][ny] = tree[le(nx)][ny] + tree[ri(nx)][ny];
else tree[nx][ny] = tree[lc(nx)][ny] + tree[rc(nx)][ny];
} else {
int my = (ly + ry) / 2;
build_y(nx, lx, rx, le(ny), ly, my);
build_y(nx, lx, rx, ri(ny), my + 1, ry);
tree[nx][ny] = tree[nx][le(ny)] + tree[nx][ri(ny)];
build_y(nx, lx, rx, lc(ny), ly, my);
build_y(nx, lx, rx, rc(ny), my + 1, ry);
tree[nx][ny] = tree[nx][lc(ny)] + tree[nx][rc(ny)];
}
}
void build_x(int nx, int lx, int rx) {
if (lx != rx) {
int mx = (lx + rx) / 2;
build_x(le(nx), lx, mx);
build_x(ri(nx), mx + 1, rx);
build_x(lc(nx), lx, mx);
build_x(rc(nx), mx + 1, rx);
}
build_y(nx, lx, rx, 0, 0, m - 1);
}
Expand All @@ -29,19 +29,19 @@ void build() { build_x(0, 0, n - 1); }
void update_y(int nx, int lx, int rx, int ny, int ly, int ry, int x, int y, int v) {
if (ly == ry) {
if (lx == rx) tree[nx][ny] = v;
else tree[nx][ny] = tree[le(nx)][ny] + tree[ri(nx)][ny];
else tree[nx][ny] = tree[lc(nx)][ny] + tree[rc(nx)][ny];
} else {
int my = (ly + ry) / 2;
if (y <= my) update_y(nx, lx, rx, le(ny), ly, my, x, y, v);
else update_y(nx, lx, rx, ri(ny), my + 1, ry, x, y, v);
tree[nx][ny] = tree[nx][le(ny)] + tree[nx][ri(ny)];
if (y <= my) update_y(nx, lx, rx, lc(ny), ly, my, x, y, v);
else update_y(nx, lx, rx, rc(ny), my + 1, ry, x, y, v);
tree[nx][ny] = tree[nx][lc(ny)] + tree[nx][rc(ny)];
}
}
void update_x(int nx, int lx, int rx, int x, int y, int v) {
if (lx != rx) {
int mx = (lx + rx) / 2;
if (x <= mx) update_x(le(nx), lx, mx, x, y, v);
else update_x(ri(nx), mx + 1, rx, x, y, v);
if (x <= mx) update_x(lc(nx), lx, mx, x, y, v);
else update_x(rc(nx), mx + 1, rx, x, y, v);
}
update_y(nx, lx, rx, 0, 0, m - 1, x, y, v);
}
Expand All @@ -51,13 +51,13 @@ int sum_y(int nx, int ny, int ly, int ry, int qly, int qry) {
if (ry < qly || ly > qry) return 0;
if (qly <= ly && ry <= qry) return tree[nx][ny];
int my = (ly + ry) / 2;
return sum_y(nx, le(ny), ly, my, qly, qry) + sum_y(nx, ri(ny), my + 1, ry, qly, qry);
return sum_y(nx, lc(ny), ly, my, qly, qry) + sum_y(nx, rc(ny), my + 1, ry, qly, qry);
}
int sum_x(int nx, int lx, int rx, int qlx, int qrx, int qly, int qry) {
if (rx < qlx || lx > qrx) return 0;
if (qlx <= lx && rx <= qrx) return sum_y(nx, 0, 0, m - 1, qly, qry);
int mx = (lx + rx) / 2;
return sum_x(le(nx), lx, mx, qlx, qrx, qly, qry) +
sum_x(ri(nx), mx + 1, rx, qlx, qrx, qly, qry);
return sum_x(lc(nx), lx, mx, qlx, qrx, qly, qry) +
sum_x(rc(nx), mx + 1, rx, qlx, qrx, qly, qry);
}
int sum(int lx, int rx, int ly, int ry) { return sum_x(0, 0, n - 1, lx, rx, ly, ry); }

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int INF = 1e9;

struct Node {
int m1 = INF, m2 = INF, cont = 0, lazy = 0;
ll soma = 0;
void set(int v) {
m1 = v;
cont = 1;
soma = v;
}
void merge(Node a, Node b) {
m1 = min(a.m1, b.m1);
m2 = INF;
if (a.m1 != b.m1) m2 = min(m2, max(a.m1, b.m1));
if (a.m2 != m1) m2 = min(m2, a.m2);
if (b.m2 != m1) m2 = min(m2, b.m2);
cont = (a.m1 == m1 ? a.cont : 0) + (b.m1 == m1 ? b.cont : 0);
soma = a.soma + b.soma;
}
};

struct SegTreeBeats {
int n, q;
vector<Node> t;
inline int lc(int n) { return 2 * n + 1; }
inline int rc(int n) { return 2 * n + 2; }
void push(int n, int esq, int dir) {
if (t[n].lazy <= t[n].m1) return;
t[n].soma += (ll)abs(t[n].m1 - t[n].lazy) * t[n].cont;
t[n].m1 = t[n].lazy;
if (esq != dir) {
t[lc(n)].lazy = max(t[lc(n)].lazy, t[n].lazy);
t[rc(n)].lazy = max(t[rc(n)].lazy, t[n].lazy);
}
t[n].lazy = 0;
}
void build(int n, int esq, int dir, const vector<ll> &v) {
if (esq == dir) {
t[n].set(v[esq]);
} else {
int mid = (esq + dir) / 2;
build(lc(n), esq, mid, v);
build(rc(n), mid + 1, dir, v);
t[n].merge(t[lc(n)], t[rc(n)]);
}
}
void build(int _n) { // pra construir com tamanho, mas vazia
n = _n;
t.assign(n * 4, Node());
}
void build(const vector<ll> &v) { // pra construir com vector
n = (int)v.size();
t.assign(n * 4, Node());
build(0, 0, n - 1, v);
}
void build(ll *bg, ll *en) { // pra construir com array de C
build(vector<ll>(bg, en));
}
// ai = max(ai, mi) em [l, r]
void update(int n, int esq, int dir, int l, int r, int mi) {
push(n, esq, dir);
if (esq > r || dir < l || mi <= t[n].m1) return;
if (l <= esq && dir <= r && mi < t[n].m2) {
t[n].lazy = mi;
push(n, esq, dir);
} else {
int mid = (esq + dir) / 2;
update(lc(n), esq, mid, l, r, mi);
update(rc(n), mid + 1, dir, l, r, mi);
t[n].merge(t[lc(n)], t[rc(n)]);
}
}
void update(int l, int r, int mi) { update(0, 0, n - 1, l, r, mi); }
// soma de [l, r]
ll query(int n, int esq, int dir, int l, int r) {
push(n, esq, dir);
if (esq > r || dir < l) return 0;
if (l <= esq && dir <= r) return t[n].soma;
int mid = (esq + dir) / 2;
return query(lc(n), esq, mid, l, r) + query(rc(n), mid + 1, dir, l, r);
}
ll query(int l, int r) { return query(0, 0, n - 1, l, r); }
} seg;
Loading

0 comments on commit b8e6cbc

Please sign in to comment.