Guest User

Juanzhang

a guest
Jun 5th, 2019
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #prag\
  5. ma GCC optimize(3)
  6. #define nc getchar()
  7. const int maxn = 505, maxm = 6e4 + 10;
  8. int Q[maxm], Q1[maxm], Q2[maxm], ans[maxm];
  9. int n, m, len, c[maxn][maxn], data[maxn * maxn];
  10.  
  11. struct matrix {
  12.   int x, y, k;
  13.  
  14.   inline bool operator < (const matrix &o) const {
  15.     return k < o.k;
  16.   }
  17. } val[maxn * maxn];
  18.  
  19. struct node {
  20.   int x1, y1, x2, y2, k, tid;
  21. } a[maxm];
  22.  
  23. inline int read() {
  24.   int x = 0;
  25.   char c = nc;
  26.   while (c < 48) c = nc;
  27.   while (c > 47) x = x * 10 + (c ^ 48), c = nc;
  28.   return x;
  29. }
  30.  
  31.  
  32. inline void add(int x, int y, int v) {
  33.   for (register int i = x; i <= n; i += i & -i) {
  34.     for (register int j = y; j <= n; j += j & -j) {
  35.       c[i][j] += v;
  36.     }
  37.   }
  38. }
  39.  
  40. inline int query(int x, int y) {
  41.   register int res = 0;
  42.   for (register int i = x; i; i &= i - 1) {
  43.     for (register int j = y; j; j &= j - 1) {
  44.       res += c[i][j];
  45.     }
  46.   }
  47.   return res;
  48. }
  49.  
  50. inline int query(int x1, int y1, int x2, int y2) {
  51.   return query(x2, y2) - query(x1 - 1, y2) - query(x2, y1 - 1) + query(x1 - 1, y1 - 1);
  52. }
  53.  
  54. void divide(int l, int r, int ql, int qr) {
  55.   if (l > r) return;
  56.   if (ql == qr) {
  57.     for (register int i = l; i <= r; ++i) {
  58.       ans[a[Q[i]].tid] = ql;
  59.     }
  60.     return;
  61.   }
  62.   int mid = (ql + qr) >> 1, p1 = 0, p2 = 0;
  63.   const int st = lower_bound(data + 1, data + len + 1, ql) - data, ed = upper_bound(data + 1, data + len + 1, mid) - data - 1;
  64.   for (register int i = st; i <= ed; ++i) {
  65.     add(val[i].x, val[i].y, 1);
  66.   }
  67.   for (register int i = l; i <= r; ++i) {
  68.     node &val = a[Q[i]];
  69.     const int s = query(val.x1, val.y1, val.x2, val.y2);
  70.     val.k > s ? val.k -= s, Q2[++p2] = Q[i] : Q1[++p1] = Q[i];
  71.   }
  72.   for (register int i = st; i <= ed; ++i) {
  73.     add(val[i].x, val[i].y, -1);
  74.   }
  75.   for (register int *i = Q + l, *j = Q1 + 1, *t = Q + l + p1; i != t; ++i, ++j) {
  76.     *i = *j;
  77.   }
  78.   for (register int *i = Q + l + p1, *j = Q2 + 1, *t = Q + r + 1; i != t; ++i, ++j) {
  79.     *i = *j;
  80.   }
  81.   divide(l, l + p1 - 1, ql, mid);
  82.   divide(l + p1, r, mid + 1, qr);
  83. }
  84.  
  85. int main() {
  86.   n = read(), m = read();
  87.   for (register int i = 1; i <= n; ++i) {
  88.     for (register int j = 1; j <= n; ++j) {
  89.       const int id = (i - 1) * n + j;
  90.       val[id].k = read();
  91.       val[id].x = i, val[id].y = j;
  92.     }
  93.   }
  94.   len = n * n;
  95.   sort(val + 1, val + len + 1);
  96.   for (register int i = 1; i <= len; ++i) {
  97.     data[i] = val[i].k;
  98.   }
  99.   for (register int i = 1; i <= m; ++i) {
  100.     a[i].x1 = read(), a[i].y1 = read();
  101.     a[i].x2 = read(), a[i].y2 = read();
  102.     a[i].tid = Q[i] = i, a[i].k = read();
  103.   }
  104.   divide(1, m, 0, 1e9);
  105.   for (register int i = 1; i <= m; ++i) {
  106.     printf("%d\n", ans[i]);
  107.   }
  108.   return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment