-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathplatforma.cpp
74 lines (61 loc) · 1.44 KB
/
platforma.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# include <cstdio>
# include <algorithm>
# include <cstring>
# include <deque>
# define NR 1005
# define mod 666013
# define inf 999999999
using namespace std;
deque <int> d;
int i,j,n,m,A,B,minn;
int a[NR][NR], maxx[NR][NR];
void solve (int x, int y)
{
int i,j;
//preprocesam
for (j=1; j<=m; ++j)
{
d.clear();
for (i=1; i<=n; ++i)
{
while (! d.empty() && a[i][j]>=a[d.back()][j])
d.pop_back();
d.push_back(i);
if (i>=y) //daca ajunge la pozitii valide
{
if (d.front() == i-y) d.pop_front();
maxx[i][j]=a[d.front()][j];
}
}
}
for (i=1; i<=n-y+1; ++i)
{
d.clear();
for (j=1; j<=m; ++j)
{
while (! d.empty() && maxx[i+y-1][j] > maxx[i+y-1][d.back()])
d.pop_back();
d.push_back(j);
if (j>=x)
{
if (d.front() == j-x) d.pop_front();
minn=min(minn, maxx[i+y-1][d.front()]);
}
}
}
}
int main ()
{
freopen ("platforma.in", "r", stdin);
freopen ("platforma.out", "w", stdout);
scanf ("%d%d%d%d", &n, &m, &A, &B);
for (i=1; i<=m; ++i)
scanf ("%d", &a[1][i]);
for (i=2; i<=n; ++i)
for (j=1; j<=m; ++j)
a[i][j]=(1LL*a[i-1][j]*i)%mod;
minn=inf;
solve (B, A);
printf ("%d\n", minn);
return 0;
}