Cod sursa(job #1463973)

Utilizator Liviu98Dinca Liviu Liviu98 Data 21 iulie 2015 22:43:07
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <vector>
using namespace std;
int N,M;
vector <int> Graf[100100];
bool uz[100100];
int v[200100],nr1,stg[100100],drt[100100],k,ind,val;
struct Interval
{
    int suma,maxim;
}Arb[1100000];
int x,y,op;

void Liniarizare(int x)
{
    uz[x]=true;
    v[++k]=x;
    stg[x]=k;
    for(vector<int>::iterator it=Graf[x].begin();it!=Graf[x].end();it++)
        if(uz[*it]==false)
        Liniarizare(*it);
    v[++k]=x;
    drt[x]=k;
}

void Update(int nod,int st,int dr)
{
    if(st>=stg[ind] && dr<=drt[ind])
        Arb[nod].suma=Arb[nod].suma+val;
    else
    {
        int mij=(st+dr)/2;
        if(stg[ind]<=mij)
            Update(2*nod,st,mij);
        if(mij+1<=drt[ind])
            Update(2*nod+1,mij+1,dr);
    }
    Arb[nod].maxim=Arb[nod].suma+max(Arb[2*nod].maxim,Arb[2*nod+1].maxim);
}

void Query(int nod,int st,int dr,int S)
{
    if(ind>=1)
        return;
    if(Arb[nod].suma==S)
    {
        ind=v[st];
        return;
    }
    if(st<dr && Arb[nod].suma<S && Arb[nod].maxim>=S)
    {
        int mij=(st+dr)/2;
        Query(2*nod,st,mij,S-Arb[nod].suma);
        Query(2*nod+1,mij+1,dr,S-Arb[nod].suma);
    }
}

void Solve()
{
    ifstream g("arbore.in");
    ofstream f("arbore.out");
    g>>N>>M;
    for(int i=1;i<N;i++)
    {
        g>>x>>y;
        Graf[x].push_back(y);
        Graf[y].push_back(x);
    }
    Liniarizare(1);
    for(int i=1;i<=M;i++)
    {
        g>>op;
        if(op==1)
        {
            g>>ind>>val;
            Update(1,1,k);
        }
        else
        {
            g>>val;
            ind=-1;
            Query(1,1,k,val);
            f<<ind<<"\n";
        }
    }
}

int main()
{
    Solve();
}