Cod sursa(job #1969979)

Utilizator binicBinica Nicolae binic 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;
}