Cod sursa(job #855266)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 14 ianuarie 2013 20:24:31
Problema Heavy metal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include <iostream>
#include <fstream>
#include <string>
#define DN 50005
#define un unsigned
using namespace std;

int v[DN],t[2*DN+13],maxx[2*DN+13],n,poz,val,arb[4*DN],a,b,rez=0;
string x;

inline int tata(int nod)
{
    while(t[nod])
        nod=t[nod];
    return nod;
}

void upd(int radacina,int nod)
{
    int maxim=0;
    while(t[nod])
    {
        int next_nod=t[nod];
        maxim=max(maxim,maxx[nod]);
        t[nod]=radacina;
        nod=next_nod;
    }
    maxim=max(maxim,maxx[nod]);
    maxx[radacina]=max(maxx[radacina],maxim);
    t[nod]=radacina;
}

void update(int nod,int left,int right)
{
    if(left==right)
    {
        arb[nod]=val;
        return;
    }
    int mij=(left+right)/2;
    if(poz<=mij) update(2*nod,left,mij);
        else update(2*nod+1,mij+1,right);
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
    return;
}

void query(int nod,int left,int right)
{
    if(a <= left && right <= b)
    {
        rez=max(rez,arb[nod]);
        return;
    }
    int mij=(left+right)/2;
    if(a<= mij) query(2*nod,left,mij);
    if( mij < b) query(2*nod+1,mij+1,right);

    return;

}

int main()
{
    int s,m;
    ifstream f("tabara2.in");
    ofstream g("tabara2.out");
    f>>n>>s>>m;
    getline(f,x);
    getline(f,x);

    for(un int i=0;i<x.size();++i)
    {
        if(isdigit(x[i]))
        {
            int nr=0;
            while(isdigit(x[i]))
            {
                nr=nr*10+x[i]-'0';
                ++i;
            }
            v[++v[0]]=nr;
        }
    }

    for(;m;--m)
    {
        char x;
        f>>x;
        if(x=='U')
            {
                int tip,i,j;
                f>>tip>>i>>j;
                if(tip==1)
                {
                    i+=n;
                    j+=n;
                    /// mutam tatal in i
                    int tatai=tata(i),tataj=tata(j);
                    if(tatai<=n || tataj<=n) /// daca e conectat deja cu sirul initial
                    {
                        int radacina=min(tatai,tataj);
                        if(tatai<tataj)
                        {
                            maxx[j]=max(maxx[j],v[j-n]);
                            upd(radacina,j);
                        }
                        else
                        {
                            maxx[i]=max(maxx[i],v[i-n]);
                            upd(radacina,i);
                        }
                        poz=radacina;
                        val=maxx[radacina];

                        update(1,1,n);
                    }
                    else // simplu
                    {
                        upd(i,j);
                        maxx[i]=max(maxx[i],max( v[i-n],v[j-n]));
                    }
                }
                else
                {
                    /// mutam iar tatal in i
                    int nod=j+n;
                    maxx[j+n]=max(maxx[j+n],v[j]);
                    upd(i,nod);

                    val=maxx[i];
                    poz=i;
                    update(1,1,n);
                }
            }
            else
            {
                f>>a>>b;
                rez=0;
                query(1,1,n);
                g<<rez<<"\n";
            }

    }
    return 0;
}