Pagini recente »
Clasament 2022-03-19-clasa-5-concurs07-cursuri-performanta
|
Cod sursă (job #730404)
|
Clasament 2019-10-10-clasa-7-tema-5-optionala
|
Istoria paginii runda/2020-11-06-clasa-6-tema-10
|
Cod sursă (job #730479)
Cod sursă (job
#730479)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 2000;
const int QMAX = 1e5;
ifstream fin( "virus2.in" );
ofstream fout( "virus2.out" );
struct Query{
int tip;
int l1, l2, c1, c2;
string ans;
};
Query query[QMAX+1];
int n;
int comp = 1;
int mat[NMAX+1][NMAX+1];
void set_border( int lin1, int lin2, int col1, int col2 ) {
int i;
for( i = lin1; i <= lin2; i++ )
mat[i][col1] = mat[i][col2] = comp;
for( i = col1; i <= col2; i++ )
mat[lin1][i] = mat[lin2][i] = comp;
comp++;
}
int parent[NMAX*NMAX+1];
int findd( int x ) {
if( x == parent[x] )
return x;
return parent[x] = findd( parent[x] );
}
void unite( int a, int b ) {
int x = findd( a );
int y = findd( b );
if( x != y )
parent[x] = y;
}
void fil( int lin, int col, int nr ) {
mat[lin][col] = nr;
if( lin - 1 >= 1 && !mat[lin-1][col] )
fil( lin - 1, col, nr );
if( lin + 1 <= n && !mat[lin+1][col] )
fil( lin + 1, col, nr );
if( col - 1 >= 1 && !mat[lin][col-1] )
fil( lin, col - 1, nr );
if( col + 1 <= n && !mat[lin][col+1] )
fil( lin, col + 1, nr );
}
int dlin[4] = { -1, 1, 0, 0 };
int dcol[4] = { 0, 0, -1, 1 };
void desinfect( int lin, int col ) {
int k;
for( k = 0; k < 4; k++ ) {
if( mat[lin][col] < mat[lin+dlin[k]][col+dcol[k]] )
unite( mat[lin][col], mat[lin+dlin[k]][col+dcol[k]] );
}
}
int main() {
int q, i, j, last;
fin >> n >> q;
for( i = 0; i < q; i++ ) {
fin >> query[i].tip >> query[i].l1 >> query[i].c1 >> query[i].l2 >> query[i].c2;
if( query[i].tip == 1 )
set_border( query[i].l1, query[i].l2, query[i].c1, query[i].c2 );
}
last = comp - 1;
for( i = 1; i <= n; i++ ) {
for( j = 1; j <= n; j++ ) {
if( !mat[i][j] ) {
fil( i, j, comp );
comp++;
}
}
}
for( i = 1; i <= n * n; i++ )
parent[i] = i;
for( i = q - 1; i >= 0; i-- ) {
if( query[i].tip == 2 ) {
if( mat[query[i].l1][query[i].c1] > last && mat[query[i].l2][query[i].c2] > last ) {
int x = findd( mat[query[i].l1][query[i].c1] );
int y = findd( mat[query[i].l2][query[i].c2] );
if( x == y )
query[i].ans = "DA";
else query[i].ans = "NU";
}
else
query[i].ans = "NU";
}
else {
last--;
for( j = query[i].l1; j <= query[i].l2; j++ ) {
desinfect( j, query[i].c1 );
desinfect( j, query[i].c2 );
}
for( j = query[i].c1; j <= query[i].c2; j++ ) {
desinfect( query[i].l1, j );
desinfect( query[i].l2, j );
}
}
}
for( i = 0; i < q; i++ ) {
if( query[i].tip == 2 )
fout << query[i].ans << "\n";
}
return 0;
}