Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- typedef long long integer; // change
- const integer neutr = 0; // change
- const int T = (1 << 5); // change
- integer op(integer a, integer b) // change
- {
- return a + b;
- }
- struct Tree
- {
- integer a[T][T]; // change
- int n, m; // change
- integer t[T][T];
- void build1(int ind, int pos, int v, int l, int r)
- {
- if (l + 1 == r)
- {
- t[ind][v] = a[pos][l];
- return;
- }
- int mid = (r + l) / 2;
- build1(ind, pos, 2 * v, l, mid);
- build1(ind, pos, 2 * v + 1, mid, r);
- t[ind][v] = op(t[ind][2 * v], t[ind][2 * v + 1]);
- }
- void build2(int ind, int v, int l, int r)
- {
- t[ind][v] = op(t[2 * ind][v], t[2 * ind + 1][v]);
- if (l + 1 == r)
- return;
- int mid = (r + l) / 2;
- build2(ind, 2 * v, l, mid);
- build2(ind, 2 * v + 1, mid, r);
- }
- void buildall(int v, int l, int r)
- {
- if (l + 1 == r)
- {
- build1(v, l, 1, 0, m);
- return;
- }
- int mid = (r + l) / 2;
- buildall(2 * v, l, mid);
- buildall(2 * v + 1, mid, r);
- build2(v, 1, 0, m);
- }
- void build()
- {
- buildall(1, 0, n);
- }
- Tree(vector<vector<integer> > v)
- {
- n = v.size();
- m = v[0].size();
- for (int i = 0; i < n; i++)
- for (int j = 0; j < m; j++)
- a[i][j] = v[i][j];
- build();
- }
- integer find1(int ind, int v, int ql, int qr, int l, int r) // [ql; qr) - where want to find. [l; r) - current interv
- {
- if (ql >= r || l >= qr)
- return neutr;
- if (ql <= l && r <= qr)
- return t[ind][v];
- int mid = (r + l) / 2;
- return op(find1(ind, 2 * v, ql, qr, l, mid), find1(ind, 2 * v + 1, ql, qr, mid, r));
- }
- integer find(int v, int lx, int rx, int ly, int ry, int l, int r) // [lx; rx) x [ly; ry) - where want to find. [l; r) - current interv
- {
- if (lx >= r || l >= rx)
- return neutr;
- if (lx <= l && r <= rx)
- return find1(v, 1, ly, ry, 0, m);
- int mid = (r + l) / 2;
- return op(find(2 * v, lx, rx, ly, ry, l, mid), find(2 * v + 1, lx, rx, ly, ry, mid, r));
- }
- integer find(int lx, int rx, int ly, int ry) // find op on [lx; rx) x [ly; ry)
- {
- return find(1, lx, rx, ly, ry, 0, n);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement