Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <sstream>
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <memory.h>
- #include <ctime>
- #include <bitset>
- using namespace std;
- #define ABS(a) ((a>0)?a:-(a))
- #define MIN(a,b) ((a<b)?(a):(b))
- #define MAX(a,b) ((a<b)?(b):(a))
- #define FOR(i,a,n) for (int i=(a);i<(n);++i)
- #define FI(i,n) for (int i=0; i<(n); ++i)
- #define pnt pair <int, int>
- #define mp make_pair
- #define PI 3.1415926535897
- #define MEMS(a,b) memset(a,b,sizeof(a))
- #define LL long long
- #define U unsigned
- const int N = 401;
- int max1[N][N][10][10];
- int min1[N][N][10][10];
- int a[N][N];
- int st[410];
- int main()
- {
- #ifdef Fcdkbear
- freopen("in.txt", "r", stdin);
- //freopen("out.txt", "w", stdout);
- double beg = clock();
- #endif
- int n, m, q;
- scanf("%d%d%d", &n, &m, &q);
- FOR(i, 0, n)
- FOR(j, 0, m)
- scanf("%d", &a[i][j]);
- int k1 = 1, k2 = 1;
- int st1 = 0, st2 = 0;
- while (k1 + k1 <= m)
- {
- k1 += k1;
- st1++;
- }
- while (k2 + k2 <= n)
- {
- k2 += k2;
- st2++;
- }
- FOR(i,0,n)
- FOR(j, 0, m)
- {
- min1[i][j][0][0] = max1[i][j][0][0] = a[i][j];
- }
- FOR(i, 0, n)
- {
- FOR(k, 1, st1 + 1)
- {
- int val = (1 << k);
- int nval = val / 2;
- FOR(j, 0, m)
- {
- if (j + val > m)
- break;
- max1[i][j][k][0] = MAX(max1[i][j][k - 1][0], max1[i][j + nval][k - 1][0]);
- min1[i][j][k][0] = MIN(min1[i][j][k - 1][0], min1[i][j + nval][k - 1][0]);
- }
- }
- }
- FOR(j, 0, m)
- {
- FOR(k, 1, st2 + 1)
- {
- int val = (1 << k);
- int nval = val / 2;
- FOR(i, 0, n)
- {
- if (i + val > n)
- break;
- max1[i][j][0][k] = MAX(max1[i][j][0][k - 1], max1[i + nval][j][0][k - 1]);
- min1[i][j][0][k] = MIN(min1[i][j][0][k - 1], min1[i + nval][j][0][k - 1]);
- }
- }
- }
- FOR(k1, 1, st1 + 1)
- {
- int val1 = (1 << k1);
- int nval1 = val1 / 2;
- FOR(k2, 1, st2 + 1)
- {
- int val2 = (1 << k2);
- int nval2 = val2 / 2;
- FOR(i, 0, n)
- {
- FOR(j, 0, m)
- {
- if ((j + val1 > m) || (i + val2 > n))
- continue;
- max1[i][j][k1][k2] = MAX(MAX(max1[i][j][k1 - 1][k2 - 1], max1[i + nval2][j][k1 - 1][k2 - 1]), MAX(max1[i][j+nval1][k1 - 1][k2 - 1], max1[i + nval2][j+nval1][k1 - 1][k2 - 1]));
- min1[i][j][k1][k2] = MIN(MIN(min1[i][j][k1 - 1][k2 - 1], min1[i + nval2][j][k1 - 1][k2 - 1]), MIN(min1[i][j + nval1][k1 - 1][k2 - 1], min1[i + nval2][j + nval1][k1 - 1][k2 - 1]));
- }
- }
- }
- }
- st[1] = 0;
- int c = 0;
- FOR(i, 2, 401)
- {
- int v = (1 << c);
- if (v + v < i)
- c++;
- st[i] = c;
- }
- FOR(it, 0, q)
- {
- int val;
- cin >> val;
- LL res = 0;
- FOR(i, 0, n)
- {
- FOR(j, 0, m)
- {
- int down = n - 1;
- FOR(k, j, m)
- {
- while (down >= i)
- {
- int dx = down - i + 1;
- int dy = k - j + 1;
- int k1 = st[dy];
- int k2 = st[dx];
- int val1 = (1 << k1);
- int val2 = (1 << k2);
- int max11 = MAX(max1[i][j][k1][k2], max1[i][k-val1+1][k1][k2]);
- int max12 = MAX(max1[down - val2 + 1][j][k1][k2], max1[down - val2 + 1][k - val1 + 1][k1][k2]);
- int min11 = MIN(min1[i][j][k1][k2], min1[i][k - val1 + 1][k1][k2]);
- int min12 = MIN(min1[down - val2 + 1][j][k1][k2], min1[down - val2 + 1][k - val1 + 1][k1][k2]);
- int cmax = MAX(max11, max12);
- int cmin = MIN(min11, min12);
- if (cmax - cmin > val)
- down--;
- else
- break;
- }
- if (down < i)
- break;
- res += down - i + 1;
- }
- }
- }
- cout << res << endl;
- }
- #ifdef Fcdkbear
- double end = clock();
- fprintf(stderr, "*** Total time = %.3lf ***\n", (end - beg) / CLOCKS_PER_SEC);
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement