Nu aveti permisiuni pentru a descarca fisierul grader_test6.in
Cod sursa(job #1969979)
Utilizator | Data | 18 aprilie 2017 19:25:21 | |
---|---|---|---|
Problema | Arbore | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.58 kb |
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,Q,Q1,b[200][200],ad[200][200],ver[200][200];
char c;
vector<int>v[160],vt[160];
bitset<200>a[170];
void adauga(int x, int y)
{
int nod;
b[x][y]++;
a[x][y] = 1;
for(int i = 0; i < vt[x].size(); i ++)
{
nod = vt[x][i];
if(ad[nod][x] == 0) continue;
b[nod][y] ++;
a[nod][y] = 1;
}
for(int i = 0; i < v[y].size(); i ++)
{
nod = v[y][i];
if(ad[y][nod] == 0) continue;
b[x][nod] ++;
a[x][nod] = 1;
}
}
void sterge(int x, int y)
{
int nod;
if(b[x][y] > 0)b[x][y]--;
if(!b[x][y]) a[x][y] = 0;
for(int i = 0; i < vt[x].size(); i ++)
{
nod = vt[x][i];
if(ad[nod][x] == 0) continue;
if(b[nod][y] > 0) b[nod][y] --;
if(!b[nod][y])
a[nod][y] = 0;
}
for(int i = 0; i < v[y].size(); i ++)
{
nod = v[y][i];
if(ad[y][nod] == 0) continue;
if(b[x][nod] > 0)b[x][nod] --;
if(!b[x][nod])
a[x][nod] = 0;
}
}
void query(int x, int y)
{
bool ok1 = a[x][x], ok2 = a[x][y];
a[x][x] = a[y][x];
a[x][y] = a[y][y];
if(a[x] == a[y]) printf("YES\n");
else printf("NO\n");
a[x][x] = ok1;
a[x][y] = ok2;
}
int main()
{
freopen("prietene.in","r",stdin);
freopen("prietene.out","w",stdout);
scanf("%d",&Q1);
while(Q1--)
{
for(int i = 1; i <= n;i ++)
{
v[i].clear();
vt[i].clear();
}
memset(ad,0,sizeof(ad));
memset(ver,0,sizeof(ver));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d %d\n", &n, &m);
for (int i = 1; i <= m; i ++)
{
scanf("%d %d\n", &x, &y);
ver[x][y]++;
ad[x][y] = 1;
v[x].push_back(y);
vt[y].push_back(x);
adauga(x,y);
}
scanf("%d\n",&Q);
while(Q--)
{
scanf("%c %d %d\n",&c, &x, &y);
if (c == 'a')
{
ad[x][y] = 1;
if(ver[x][y] == 0)
{
v[x].push_back(y);
vt[y].push_back(x);
ver[x][y] = 1;
}
adauga(x,y);
}
else if (c == 'd')
{
ad[x][y] = 0;
sterge(x,y);
}
else if ( c == 'q')
query(x,y);
}
}
return 0;
}