Advertisement
K_Y_M_bl_C

TASK НЛО

Dec 23rd, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.26 KB | None | 0 0
  1. /*
  2. ID: wtfalex2
  3. LANG: C++14
  4. PROB: castle
  5. */
  6. #define _CRT_SECURE_NO_WARNINGS
  7. #pragma comment(linker, "/STACK:256000000")
  8.  
  9. #include <iostream>
  10. #include <cstdio>
  11. #include <cmath>
  12. #include <vector>
  13. #include <ctime>
  14. #include <map>
  15. #include <set>
  16. #include <string>
  17. #include <queue>
  18. #include <deque>
  19. #include <cassert>
  20. #include <cstdlib>
  21. #include <bitset>
  22. #include <algorithm>
  23. #include <string>
  24. #include <list>
  25. #include <fstream>
  26. #include <cstring>
  27. #include <climits>
  28. #include <stack>
  29. #include <unordered_map>
  30. #include <unordered_set>
  31.  
  32. using namespace std;
  33.  
  34. typedef unsigned long long ull;
  35. typedef long long ll;
  36. typedef pair<int, int> pii;
  37. typedef vector<int> vi;
  38. typedef pair<string, int> psi;
  39. typedef vector<string> vs;
  40. typedef pair<ll, ll> pll;
  41. typedef vector<ll> vll;
  42. typedef vector<char> vc;
  43. typedef vector<pii> vpii;
  44. typedef vector<pair<ll, ll> > vpll;
  45. typedef long double ld;
  46.  
  47. #define forn(i, n) for (int i = 0; i < (int)n; i++)
  48. #define for1(i, n) for (int i = 1; i <= (int)n; i++)
  49. #define forq(i, s, t) for (int i = s; i <= t; i++)
  50. #define ford(i, s, t) for (int i = s; i >= t; i--)
  51. #define mk make_pair
  52. #define inb push_back
  53. #define outb pop_back
  54. #define all(v) v.begin(), v.end()
  55. #define X first
  56. #define Y second
  57. #define TIME clock() * 1.0 / CLOCKS_PER_SEC
  58. #define sqr(x) (x) * (x)
  59. #define y1 amdknkgsdaasdwapgnpikn
  60. //
  61. #define mp make_pair
  62. #define pb push_back
  63. #define XX first
  64. #define YY second
  65. //
  66.  
  67. const ld EPS = 1e-9;
  68. const ld pi = acos(-1.0);
  69.  
  70. const int MAXN = (int)4e5 + 7;
  71. const ll INF = (ll)(1ll << 31ll) - 1ll;
  72. const ll LINF = (ll)7e18;
  73. const ll MOD = (ll)1e9 + 7;
  74. const int CHASH = (ll)239017;
  75. const ld DINF = (ld)1000000000000000.0;
  76.  
  77. void mkfile();
  78. int solve();
  79.  
  80. int main()
  81. {
  82. #define TASK "ufo"
  83. #ifdef _DEBUG
  84.     mkfile();
  85.     freopen("input.txt", "r", stdin);
  86.     freopen("output.txt", "w", stdout);
  87.     freopen("test.txt", "w", stderr);
  88.     ld tstart = TIME;
  89.     srand(2299);
  90. #else
  91.     freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  92.     //freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout), freopen("test.txt", "w", stderr);
  93.     srand(time(0));
  94. #endif
  95.     solve();
  96. #ifdef _DEBUG
  97.     ld tend = TIME;
  98.     cerr << tend - tstart << " s.\n";
  99. #endif
  100.     return 0;
  101. }
  102.  
  103. void mkfile()
  104. {
  105.     freopen("input.txt", "a+", stdout);
  106.     srand(time(0));
  107.     return;
  108. }
  109.  
  110. bool equal(double a, double b)
  111. {
  112.     return abs(a - b) < EPS;
  113. }
  114.  
  115. const int MM = (int)4e8 + 7;
  116.  
  117. int n, m, p, r, k;
  118. int a[1000007];
  119. int t[2][4000007];
  120. int ans;
  121.  
  122. void buildRow(int id, int v, int tl, int tr)
  123. {
  124.     if (tl == tr)
  125.         t[0][((id * m) << 2) + v] = a[id * m + tl];
  126.     else
  127.     {
  128.         int tm = tl + tr >> 1;
  129.         buildRow(id, (v << 1) + 1, tl, tm);
  130.         buildRow(id, (v << 1) + 2, tm + 1, tr);
  131.         t[0][((id * m) << 2) + v] = max(t[0][((id * m) << 2) + (v << 1) + 1], t[0][((id * m) << 2) + (v << 1) + 2]);
  132.     }
  133. }
  134.  
  135. void buildCol(int id, int v, int tl, int tr)
  136. {
  137.     if (tl == tr)
  138.         t[1][v * m + id] = a[tl * m + id];
  139.     else
  140.     {
  141.         int tm = tl + tr >> 1;
  142.         buildCol(id, (v << 1) + 1, tl, tm);
  143.         buildCol(id, (v << 1) + 2, tm + 1, tr);
  144.         t[1][v * m + id] = max(t[1][((v << 1) + 1) * m + id], t[1][((v << 1) + 2) * m + id]);
  145.     }
  146. }
  147.  
  148. int findLRow(int id, int v, int tl, int tr, int pos, int val)
  149. {
  150.     if (tr < pos || t[0][((id * m) << 2) + v] < val)
  151.         return -1;
  152.     if (tl == tr)
  153.         return tl;
  154.     int tm = tl + tr >> 1;
  155.     int ql = -1;
  156.     if (!(tr < pos || t[0][((id * m) << 2) + (v << 1) + 1] < val))
  157.         ql = findLRow(id, (v << 1) + 1, tl, tm, pos, val);
  158.     if (ql == -1)
  159.     {
  160.         if (!(tr < pos || t[0][((id * m) << 2) + (v << 1) + 2] < val))
  161.             return findLRow(id, (v << 1) + 2, tm + 1, tr, pos, val);
  162.         return -1;
  163.     }
  164.     return ql;
  165. }
  166.  
  167. int findRRow(int id, int v, int tl, int tr, int pos, int val)
  168. {
  169.     if (tl > pos || t[0][((id * m) << 2) + v] < val)
  170.         return -1;
  171.     if (tl == tr)
  172.         return tl;
  173.     int tm = tl + tr >> 1;
  174.     int qr = -1;
  175.     if (!(tl > pos || t[0][((id * m) << 2) + (v << 1) + 2] < val))
  176.         qr = findRRow(id, (v << 1) + 2, tm + 1, tr, pos, val);
  177.     if (qr == -1)
  178.     {
  179.         if (!(tl > pos || t[0][((id * m) << 2) + (v << 1) + 1] < val))
  180.             return findRRow(id, (v << 1) + 1, tl, tm, pos, val);
  181.         return -1;
  182.     }
  183.     return qr;
  184. }
  185.  
  186. int findUCol(int id, int v, int tl, int tr, int pos, int val)
  187. {
  188.     if (tr < pos || t[1][v * m + id] < val)
  189.         return -1;
  190.     if (tl == tr)
  191.         return tl;
  192.     int tm = tl + tr >> 1;
  193.     int ql = -1;
  194.     if (!(tr < pos || t[1][((v << 1) + 1) * m + id] < val))
  195.         ql = findUCol(id, (v << 1) + 1, tl, tm, pos, val);
  196.     if (ql == -1)
  197.     {
  198.         if (!(tr < pos || t[1][((v << 1) + 2) * m + id] < val))
  199.             return findUCol(id, (v << 1) + 2, tm + 1, tr, pos, val);
  200.         return -1;
  201.     }
  202.     return ql;
  203. }
  204.  
  205. int findDCol(int id, int v, int tl, int tr, int pos, int val)
  206. {
  207.     if (tl > pos || t[1][v * m + id] < val)
  208.         return -1;
  209.     if (tl == tr)
  210.         return tl;
  211.     int tm = tl + tr >> 1;
  212.     int qr = -1;
  213.     if (!(tl > pos || t[1][((v << 1) + 2) * m + id] < val))
  214.         qr = findDCol(id, (v << 1) + 2, tm + 1, tr, pos, val);
  215.     if (qr == -1)
  216.     {
  217.         if (!(tl > pos || t[1][((v << 1) + 1) * m + id] < val))
  218.             return findDCol(id, (v << 1) + 1, tl, tm, pos, val);
  219.         return -1;
  220.     }
  221.     return qr;
  222. }
  223.  
  224. void updateRow(int id, int v, int tl, int tr, int pos)
  225. {
  226.     if (tl == tr)
  227.     {
  228.         --t[0][((id * m) << 2) + v];
  229.         return;
  230.     }
  231.     int tm = tl + tr >> 1;
  232.     if (!(tl > pos || tm < pos))
  233.         updateRow(id, (v << 1) + 1, tl, tm, pos);
  234.     if (!(tm + 1 > pos || tr < pos))
  235.         updateRow(id, (v << 1) + 2, tm + 1, tr, pos);
  236.     t[0][((id * m) << 2) + v] = max(t[0][((id * m) << 2) + (v << 1) + 1], t[0][((id * m) << 2) + (v << 1) + 2]);
  237. }
  238.  
  239. void updateCol(int id, int v, int tl, int tr, int pos)
  240. {
  241.     if (tl == tr)
  242.     {
  243.         --t[1][v * m + id];
  244.         return;
  245.     }
  246.     int tm = tl + tr >> 1;
  247.     if (!(tl > pos || tm < pos))
  248.         updateCol(id, (v << 1) + 1, tl, tm, pos);
  249.     if (!(tm + 1 > pos || tr < pos))
  250.         updateCol(id, (v << 1) + 2, tm + 1, tr, pos);
  251.     t[1][v * m + id] = max(t[1][((v << 1) + 1) * m + id], t[1][((v << 1) + 2) * m + id]);
  252. }
  253.  
  254. void getRow(int id, int v, int tl, int tr)
  255. {
  256.     if (tl == tr)
  257.         a[id * m + tl] = t[0][((id * m) << 2) + v];
  258.     else
  259.     {
  260.         int tm = tl + tr >> 1;
  261.         getRow(id, (v << 1) + 1, tl, tm);
  262.         getRow(id, (v << 1) + 2, tm + 1, tr);
  263.     }
  264. }
  265.  
  266. int solve()
  267. {
  268.     scanf("%d %d %d %d %d", &n, &m, &r, &k, &p);
  269.     forn(i, n)
  270.         forn(j, m)
  271.             scanf("%d", &a[i * m + j]);
  272.     forn(i, n)
  273.         buildRow(i, 0, 0, m - 1);
  274.     forn(i, m)
  275.         buildCol(i, 0, 0, n - 1);
  276.     forn(it, k)
  277.     {
  278.         char c;
  279.         int x, h;
  280.         scanf(" %c %d %d", &c, &x, &h);
  281.         --x;
  282.         if (c == 'N')
  283.         {
  284.             int i = 0;
  285.             int pos = -2;
  286.             while (i < r && pos != -1)
  287.             {
  288.                 pos = findUCol(x, 0, 0, n - 1, pos + 1, h);
  289.                 if (pos != -1)
  290.                 {
  291.                     updateCol(x, 0, 0, n - 1, pos);
  292.                     updateRow(pos, 0, 0, m - 1, x);
  293.                 }
  294.                 ++i;
  295.             }
  296.         }
  297.         if (c == 'S')
  298.         {
  299.             int i = 0;
  300.             int pos = n;
  301.             while (i < r && pos != -1)
  302.             {
  303.                 pos = findDCol(x, 0, 0, n - 1, pos - 1, h);
  304.                 if (pos != -1)
  305.                 {
  306.                     updateCol(x, 0, 0, n - 1, pos);
  307.                     updateRow(pos, 0, 0, m - 1, x);
  308.                 }
  309.                 ++i;
  310.             }
  311.         }
  312.         if (c == 'W')
  313.         {
  314.             int i = 0;
  315.             int pos = -2;
  316.             while (i < r && pos != -1)
  317.             {
  318.                 pos = findLRow(x, 0, 0, m - 1, pos + 1, h);
  319.                 if (pos != -1)
  320.                 {
  321.                     updateRow(x, 0, 0, m - 1, pos);
  322.                     updateCol(pos, 0, 0, n - 1, x);
  323.                 }
  324.                 ++i;
  325.             }
  326.         }
  327.         if (c == 'E')
  328.         {
  329.             int i = 0;
  330.             int pos = m;
  331.             while (i < r && pos != -1)
  332.             {
  333.                 pos = findRRow(x, 0, 0, m - 1, pos - 1, h);
  334.                 if (pos != -1)
  335.                 {
  336.                     updateRow(x, 0, 0, m - 1, pos);
  337.                     updateCol(pos, 0, 0, n - 1, x);
  338.                 }
  339.                 ++i;
  340.             }
  341.         }
  342.     }
  343.     forn(i, n)
  344.         getRow(i, 0, 0, m - 1);
  345.     forn(i, n)
  346.     {
  347.         forn(j, m)
  348.         {
  349.             if (i && j)
  350.                 a[i * m + j] = ((a[i * m + j] + a[(i - 1) * m + j] + a[i * m + j - 1] - a[(i - 1) * m + j - 1]) % MM) + MM % MM;
  351.             if (i && !j)
  352.                 a[i * m + j] = (a[i * m + j] + a[(i - 1) * m + j]) % MM;
  353.             if (!i && j)
  354.                 a[i * m + j] = (a[i * m + j] + a[i * m + j - 1]) % MM;
  355.             if (i >= p && j >= p)
  356.                 ans = max(ans, (((a[i * m + j] + a[(i - p) * m + j - p]) % MM - (a[(i - p) * m + j] + a[i * m + j - p]) % MM) % MM + MM) % MM);
  357.             if (i >= p && j == p - 1)
  358.                 ans = max(ans, ((a[i * m + j] - a[(i - p) * m + j]) % MM + MM) % MM);
  359.             if (i == p - 1 && j >= p)
  360.                 ans = max(ans, ((a[i * m + j] - a[i * m + j - p]) % MM + MM) % MM);
  361.             if (i == p - 1 && j == p - 1)
  362.                 ans = max(ans, a[i * m + j]);
  363.         }
  364.     }
  365.     printf("%d\n", ans);
  366.     return 0;
  367. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement