Cod sursa(job #3225273)

Utilizator emazareMazare Emanuel emazare Data 17 aprilie 2024 11:21:04
Problema Arbore Scor 75
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 3.05 kb
#include <fstream>
#include <vector>
#include <map>

using namespace std;

ifstream fin("arbore.in");
ofstream fout("arbore.out");

const int Nmax = 100005, SQ = 325;
int n,m,sq,k,v[Nmax],mark[Nmax],scv[Nmax],s[SQ],crq[SQ],pos[Nmax],val[Nmax];
vector<int> L[Nmax];
map<int, int> fr[SQ];

void dfs(int node){
    pos[node] = ++k;
    v[k] = node;
    for(int son : L[node]){
        if(pos[son] == 0)
            dfs(son);
    }
    mark[node] = k+1;
}

int main()
{
    int i,j,l,c,r;
    fin >> n >> m;
    for(i=1;i<=n-1;i++){
        int x,y;
        fin >> x >> y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
    k = 0;
    dfs(1);
    sq = 1;
    while(sq*sq<=n)
        sq++;
    c = n/sq; r = n-sq*c;
    j = 1;
    for(i=1;i<=r;i++){
        s[i] = j;
        j+=(c+1);
        for(l=s[i];l<j;l++)
            scv[l] = i;
        fr[i][0] = c+1;
    }
    for(i=r+1;i<=sq;i++){
        s[i] = j;
        j+=c;
        for(l=s[i];l<j;l++)
            scv[l] = i;
        fr[i][0] = c;
    }
    s[sq+1] = n+1;
    scv[n+1] = sq+1;
    for(int itr=1;itr<=m;itr++){
        int t;
        fin >> t;
        if(t == 1){
            int node,sum,st,dr,p;
            fin >> node >> sum;
            p = pos[node];
            st = scv[p-1]+1;
            dr = scv[mark[node]]-1;
            if(st<=dr){
                for(i=st;i<=dr;i++)
                    crq[i]+=sum;
                for(i=p;i<s[st];i++){
                    val[i]+=sum;
                    fr[scv[i]][val[i]-sum]--;
                    fr[scv[i]][val[i]]++;
                    if(fr[scv[i]][val[i]-sum] == 0)
                        fr[scv[i]].erase(val[i]-sum);
                }
                for(i=mark[node]-1;i>=s[dr+1];i--){
                    val[i]+=sum;
                    fr[scv[i]][val[i]-sum]--;
                    fr[scv[i]][val[i]]++;
                    if(fr[scv[i]][val[i]-sum] == 0)
                        fr[scv[i]].erase(val[i]-sum);
                }
            }
            else{
                for(i=p;i<mark[node];i++){
                    val[i]+=sum;
                    fr[scv[i]][val[i]-sum]--;
                    fr[scv[i]][val[i]]++;
                    if(fr[scv[i]][val[i]-sum] == 0)
                        fr[scv[i]].erase(val[i]-sum);
                }
            }
        }
        else{
            int sum,nr = 0;
            fin >> sum;
            i = 1;
            while(i<=sq && nr == 0){
                if(sum-crq[i]<0)
                    nr = 0;
                else{
                    nr = fr[i][sum-crq[i]];
                    if(nr>0){
                        j = s[i];
                        while(j<s[i+1] && val[j]!=sum-crq[i])
                            j++;
                        fout << v[j] << '\n';
                    }
                    else
                        fr[i].erase(sum-crq[i]);
                }
                i++;
            }
            if(nr == 0)
                fout << "-1\n";
        }
    }
    return 0;
}