Cod sursa(job #1404939)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 28 martie 2015 18:02:15
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define nmax 10005

using namespace std;

vector <int>g[nmax];
int n,m,st[nmax],vf,val,rez,x,y;
bool cul[nmax],viz[nmax];

void citire()
{
    int x,y;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
}

void dfs(int k)
{
    if(rez!=-1)
        return;
    viz[k]=1;
    st[++vf]=k;
    if(cul[k]==1&&val==-1)
        val=k;
    if(k==y)
    {
        rez=val;
        return;
    }
    for(vector<int>::iterator ii=g[k].begin();ii!=g[k].end();++ii)
    {
        if(rez!=-1)
            return;
        if(viz[*ii]==0)
            dfs(*ii);
    }
    if(val==k)
        val=-1;
    vf--;
    if(rez!=-1)
        return;
}

void rezolv()
{
    val=-1;
    rez=-1;
    vf=0;
    memset(viz,0,sizeof(viz));
    dfs(x);
    if(rez!=-1)
        printf("%d\n",rez);
    else
        printf("-1\n");
}

int main()
{
    freopen("confuzie.in","r",stdin);
    freopen("confuzie.out","w",stdout);
    citire();
    int t;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&t,&x);
        if(t==1)
            scanf("%d",&y);
        if(t==0)
            cul[x]=!cul[x];
        else
            rezolv();
    }
    return 0;
}