Cod sursa(job #1157115)

Utilizator radu2004GOLD radu radu2004 Data 28 martie 2014 11:38:50
Problema Heavy Path Decomposition Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.17 kb
#include <stdio.h>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;
vector <int> path[100001],v[100001],a[100001];
int whatpoz[100001],whatpath[100001],val[100001],tata[100001],ter[100001],x,y,i,n,m,tare,max1,niv[100001],sub[100001],nr,tip;
FILE *f,*g;
void df (int x)
{
    niv[x]=niv[tata[x]]+1;
    int j;
    int fiu=0;
    for (j=0;j<v[x].size ();j++)
    {
        if (tata[v[x][j]]==0 && v[x][j]!=1)
        {
            tata[v[x][j]]=x;
            df (v[x][j]);
            sub[x]+=sub[v[x][j]];
            if (sub[v[x][j]]>sub[fiu]) fiu=v[x][j];
        }
    }
    if (fiu==0)
       {
           path[++nr].push_back (x);
           whatpath[x]=nr;
           sub[x]=1;
       }
      else
      {
          path[whatpath[fiu]].push_back (x);
          whatpath[x]=whatpath[fiu];
      }
}
void fa (int nod,int st, int dr,int pat)
{
    if (st==dr)
    {
        a[pat][nod]=val[path[pat][st]];
    }
    else
    {
    int mij=(st+dr)/2;
    fa (nod*2,st,mij,pat);
    fa (nod*2+1,mij+1,dr,pat);
    a[pat][nod]=max (a[pat][2*nod],a[pat][2*nod+1]);
    tare=a[pat][nod];
    }
}
void baga ()
{
    int j;
    for (j=1;j<=nr;j++)
    {
        reverse (path[j].begin (),path[j].end ());
        ter[j]=path[j][0];
        for (int k=0;k<path[j].size ();k++)
        {
            tare=path[j][k];
            whatpoz[path[j][k]]=k;
        }
        a[j].resize (4*path[j].size ());
        fa (1,0,path[j].size ()-1,j);
    }

}
void update (int nod,int st,int dr,int pat)
{
    if (st==dr)
    {
        a[pat][nod]=x;
    }
    else
        {
            int mij=(st+dr)/2;
            if (mij>=whatpoz [x]) update (nod*2,st,mij,pat);
              else update (nod*2+1,mij+1,dr,pat);
              a[pat][nod]=max (a[pat][nod*2],a[pat][nod*2+1]);
        }

}
void querry (int nod,int st,int dr,int pat,int x,int y)
{
    if (st>=x && y>=dr)
    {
        max1=max (max1,a[pat][nod]);
    }
    else
    {
       int mij=(st+dr)/2;


        if (x<=mij) querry (nod*2,st,mij,pat,x,y);
        if (mij<y) querry (nod*2+1,mij+1,dr,pat,x,y);
    }
}
void cauta (int x,int y)
{
    if (whatpath[x]==whatpath[y])
    {
        querry (1,0,path[whatpath[y]].size()-1,whatpath[y],min(whatpoz[x],whatpoz[y]),max (whatpoz[x],whatpoz[y]));
    }
    else
    {
        int t1,t2;
        t1=ter[whatpath[x]];
        t2=ter[whatpath[y]];
        if (niv[t2]<niv[t1])
        {
            swap (t1,t2);
            swap (x,y);
        }
        querry (1,0,path[whatpath[y]].size()-1,whatpath[y],0,whatpoz[y]);
        cauta (tata[t2],x);
    }
}
int main()
{f=fopen ("heavypath.in","r");
 g=fopen ("heavypath.out","w");
 fscanf (f,"%d%d",&n,&m);
 for (i=1;i<=n;i++) fscanf (f,"%d",&val[i]);
 for (i=1;i<n;i++)
 {
     fscanf (f,"%d%d",&x,&y);
     v[x].push_back (y);
     v[y].push_back (x);
 }

df (1);
baga ();
for (i=1;i<=m;i++)
{
    fscanf (f,"%d%d%d",&tip,&x,&y);
    if (tip==0) update (1,0,path[whatpath[x]].size()-1,whatpath[x]);
     else
     {
         max1=-1;
         cauta (x,y);
         fprintf (g,"%d\n",max1);
     }

}

    return 0;
}