2902 - Pavaj

De la Universitas MediaWiki

Cerința

Curtea bunicului are forma unei matrice cu n linii și m coloane și este pavată cu n*m dale, o parte dintre acestea fiind deteriorate. Bunicul a realizat un plan al curții în care a marcat cu 0 dalele deteriorate și cu 1 pe cele nedeteriorate.

Bunicul a primit k oferte pentru a vinde zone dreptunghiulare ale curții. Fiecare zonă este determinată de coordonatele l1 c1 l2 c2 a două colțuri opuse ale ei. Pentru fiecare zonă bunicul dorește să afle dacă conține doar dale nedeteriorate, doar dale deteriorate sau conține și dale deteriorate și dale nedeteriorate.

Date de intrare

Fișierul de intrare pavaj.in conține pe prima linie numerele n m k. Următoarele n linii conțin câte m valori 0 sau 1, reprezentând planul curții. Următoarele k linii conțin câte patru valori, l1 c1 l2 c2, reprezentând coordonatele a două colțuri opuse ale unei zone.

Date de ieșire

Fișierul de ieșire pavaj.out va conține k linii. Fiecare linie va conține valoarea 0, 1 sau 2, după cum zona corespunzătoare din fișierul de intrare:

  • conține doar dale deteriorate
  • conține doar dale nedeteriorate
  • conține atât dale nedeteriorate, cât și dale deteriorate

Restricții și precizări

  • 1 ≤ n, m ≤ 1000
  • 1 ≤ k ≤ 100000
  • 1 ≤ l1, l2 ≤ n
  • 1 ≤ c1, c2 ≤ m
  • numerotarea liniilor și a coloanelor începe de la 1
  • pentru 50% din teste 1 ≤ n, m, k ≤ 1000

Exemplu:

pavaj.in

4 6 3
0 0 1 1 1 0
0 0 1 1 1 0
0 0 0 0 0 1
1 0 1 0 1 0
1 1 3 2
2 4 1 5
1 6 4 2

pavaj.out

0
1
2

Încărcare soluție

Lipește codul aici

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream cin("pavaj.in");
    ofstream cout("pavaj.out");
    int n, m, t, s[1001][1001], i1, j1, i2, j2;
    cin >> n >> m >> t;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> s[i][j];
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            s[i][j] = s[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    for (int i = 1; i <= t; i++)
    {
        cin >> i1 >> j1 >> i2 >> j2;
        int sum = 0, nr = 0;
        if (i1 <= i2 && j1 <= j2)
            sum = s[i2][j2] - s[i1 - 1][j2] - s[i2][j1 - 1] + s[i1 - 1][j1 - 1], nr = (j2 - j1 + 1) * (i2 - i1 + 1);
        else if (i1 >= i2 && j1 <= j2)
            sum = s[i1][j2] - s[i2 - 1][j2] - s[i1][j1 - 1] + s[i2 - 1][j1 - 1], nr = (i1 - i2 + 1) * (j2 - j1 + 1);
        else if (i1 <= i2 && j1 >= j2)
            sum = s[i2][j1] - s[i1 - 1][j1] - s[i2][j2 - 1] + s[i1 - 1][j2 - 1], nr = (i2 - i1 + 1) * (j1 - j2 + 1);
        else
            sum = s[i1][j1] - s[i2 - 1][j1] - s[i1][j2 - 1] + s[i2 - 1][j2 - 1], nr = (i1 - i2 + 1) * (j1 - j2 + 1);
        if (sum == 0)
            cout << 0 << '\n';
        else if (sum == nr)
            cout << 1 << '\n';
        else
            cout << 2 << '\n';
    }
}