Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define F first
- #define S second
- #define ll long long
- #define ull unsigned long long
- #define ld long double
- #define SELO ""
- #define openfiles ifstream cin("input" SELO ".txt"); ofstream cout("output" SELO ".txt");
- #define faster ios_base::sync_with_stdio(NULL); cin.tie(0); cout.tie(0);
- #define all(x) x.begin(), x.end()
- using namespace std;
- struct point
- {
- int stx = 0, sty = 0, fx = 0, fy = 0;
- int it;
- };
- int n, m, q;
- vector <vector <int> > a;
- vector <point> Queries;
- vector <int> ans;
- priority_queue <pair <int, pair <int, int> > > s;
- vector <vector <int> > len;
- void dfs(int l, int r, vector <point> cur)
- {
- int mid = (l + r) / 2;
- for(int zzz = 0; zzz < n; zzz++)
- {
- s.push({-a[zzz][mid], {zzz, mid}});
- len.assign(n, vector <int> (m, 1000000000));
- len[zzz][mid] = a[zzz][mid];
- while(s.size())
- {
- int x = s.top().S.F;
- int y = s.top().S.S;
- s.pop();
- int px[]{-1, 1, 0, 0};
- int py[]{0, 0, 1, -1};
- for(int i = 0; i < 4; i++)
- if(x + px[i] >= 0 && x + px[i] < n && y + py[i] >= l && y + py[i] <= r && len[x + px[i]][y + py[i]] > len[x][y] + a[x + px[i]][y + py[i]])
- {
- len[x + px[i]][y + py[i]] = len[x][y] + a[x + px[i]][y + py[i]];
- s.push({-len[x + px[i]][y + py[i]], {x + px[i], y + py[i]}});
- }
- }
- for(int i = 0; i < cur.size(); i++)
- {
- ans[cur[i].it] = min(ans[cur[i].it], len[cur[i].stx][cur[i].sty] + len[cur[i].fx][cur[i].fy] - a[zzz][mid]);
- }
- }
- vector <point> Left, Right;
- Left.reserve(cur.size());
- Right.reserve(cur.size());
- for(int i = 0; i < cur.size(); i++)
- {
- if(cur[i].sty >= l && cur[i].sty < mid && cur[i].fy >= l && cur[i].fy < mid)
- Left.push_back(cur[i]);
- if(cur[i].sty > mid && cur[i].sty <= r && cur[i].fy > mid && cur[i].fy <= r)
- Right.push_back(cur[i]);
- }
- if(l == r)
- return;
- if(Left.size() != 0)
- dfs(l, mid - 1, Left);
- if(Right.size() != 0)
- dfs(mid + 1, r, Right);
- }
- /**
- 3 3 3
- 7 5 7
- 2 6 1
- 4 8 4
- 1 2 1 1
- 2 1 2 3
- 1 3 1 1
- **/
- int main()
- {
- openfiles
- faster
- cin >> n >> m >> q;
- a.assign(n, vector <int> (m, 0));
- for(int i = 0; i < m; i++)
- {
- for(int j = 0; j < n; j++)
- {
- cin >> a[j][i];
- }
- }
- ans.assign(q, 1000000000);
- for(int i = 0; i < q; i++)
- {
- int l, r, x, y;
- cin >> l >> r >> x >> y;
- point not_Used;
- not_Used.stx = l - 1;
- not_Used.fx = x - 1;
- not_Used.sty = r - 1;
- not_Used.fy = y - 1;
- not_Used.it = i;
- Queries.push_back(not_Used);
- }
- dfs(0, m - 1, Queries);
- for(int i = 0; i < q; i++)
- cout << ans[i] << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement