Pagini recente » Monitorul de evaluare | Istoria paginii runda/preonisim2008/clasament | Istoria paginii utilizator/zgupufi | Cod sursa (job #272891) | Cod sursa (job #2863864)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m, N;
int a[250003], rmq[21][250003], p2[250003];
queue<int> q;
void RMQ()
{
int i, j, len;
p2[1] = 0;
for(i = 2; i <= N; i++)
p2[i] = 1 + p2[i / 2];
for(i = 1; i <= N; i++)
rmq[0][i] = i;
for(i = 1; (1 << i) <= N; i++)
for(j = 1; j <= N - (1 << i) + 1; i++)
{
len = (1 << (i - 1));
rmq[i][j] = rmq[i - 1][j];
if(a[rmq[i - 1][j]] < a[rmq[i - 1][j + len]])
rmq[i][j] = rmq[i - 1][j + len];
}
}
void Citire()
{
int i, x, y, k, poz1, poz2, sol1, sol2, len, expo, maxim;
fin >> n >> m;
N = n * n;
for(i = 1; i <= N; i++)
fin >> a[i];
RMQ();
for(i = 1; i <= m; i++)
{
fin >> x >> y >> k;
for(int i = 1; i <= k; i++)
{
poz1 = (x - 1) * n + y;
poz2 = (x - 1) * n + y + k - 1;
expo = p2[poz2 - poz1 + 1];
len = (1 << expo);
sol1 = rmq[expo][poz1];
sol2 = rmq[expo][poz2 - len + 1];
cout << sol1 << " " << sol2 << "\n";
if(a[sol1] > a[sol2])
q.push(a[sol1]);
else q.push(a[sol2]);
x++;
}
maxim = 0;
while(!q.empty())
{
cout << q.front() << " ";
maxim = max(maxim, q.front());
q.pop();
}
fout << maxim << "\n";
}
}
int main()
{
Citire();
fout.close();
return 0;
}