Submission #1334434

#TimeUsernameProblemLanguageResultExecution timeMemory
1334434simona1230Dynamic Diameter (CEOI19_diameter)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>

using namespace std;
long long n,q,w;
vector<pair<long long,long long> > v[200001];
pair<long long,long long> a[200001];
long long h[200001];
void read()
{
    cin>>n>>q>>w;
    for(long long i=1;i<n;i++)
    {
        long long x,y,d;
        cin>>x>>y>>d;
        a[i]={x,y};
        h[i]=d;

        v[x].push_back({y,d});
        v[y].push_back({x,d});
    }
}

long long in[200001],out[200001];
long long d[200001];
vector<long long> e;
long long num;
void dfs(long long i,long long p)
{
    in[i]=num++;
    e.push_back(i);
    for(long long j=0;j<v[i].size();j++)
    {
        pair<long long,long long> nb=v[i][j];
        if(nb.first==p)continue;
        d[nb.first]=d[i]+nb.second;
        dfs(nb.first,i);
        e.push_back(i);
        num++;
    }
    out[i]=num-1;
}

struct node
{
    long long i,j,k;
    long long ik,jk;
    long long ijk;
    node(){}
    node(long long di,long long dj,long long dk,long long dik,long long djk,long long dijk)
    {
        i=di;
        j=dj;
        k=dk;
        ik=dik;
        jk=djk;
        ijk=dijk;
    }
};

node t[800001];

node merge_(node l,node r)
{
    node ans={-1e18,-1e18,-1e18,-1e18,-1e18,-1e18};
    ans.i=max(l.i,r.i);
    ans.j=max(l.j,r.j);
    ans.k=max(l.k,r.k);


    ans.ik=max(l.ik,r.ik);
    ans.jk=max(l.jk,r.jk);

    ans.ik=max(ans.ik,l.i+r.k);
    ans.jk=max(ans.jk,l.k+r.j);


    ans.ijk=max(l.ijk,r.ijk);
    ans.ijk=max(ans.ijk,l.ik+r.j);
    ans.ijk=max(ans.ijk,l.i+r.jk);
    return ans;
}

void build(long long i,long long l,long long r)
{
    if(l==r)
    {
        long long f=e[l];
        t[i]={d[f],d[f],-2*d[f],-1e18,-1e18,-1e18};
        return;
    }

    long long m=(l+r)/2;
    build(i*2,l,m);
    build(i*2+1,m+1,r);
    t[i]=merge_(t[i*2],t[i*2+1]);
    //cout<<l<<"-"<<r<<" : "<<t[i].i<<" "<<t[i].k<<" "<<t[i].j<<" "<<t[i].ik<<" "<<t[i].jk<<" "<<t[i].ijk<<endl;
}

long long lz[800001];

void push(long long i,long long l,long long r)
{
    long long f=lz[i];

    t[i].i-=f;
    t[i].j-=f;
    t[i].k+=2*f;

    t[i].ik+=f;
    t[i].jk+=f;

    if(l!=r)
    {
        lz[i*2]+=lz[i];
        lz[i*2+1]+=lz[i];
    }

    lz[i]=0;
}

void update(long long i,long long l,long long r,long long ql,long long qr,long long vl)
{
    push(i,l,r);
    if(ql>qr)return;
    if(ql<=l&&r<=qr)
    {
        lz[i]+=vl;
        push(i,l,r);
        return;
    }
    long long m=(l+r)/2;
    update(i*2,l,m,ql,min(m,qr),vl);
    update(i*2+1,m+1,r,max(m+1,ql),qr,vl);

    t[i]=merge_(t[i*2],t[i*2+1]);

}

void solve()
{
    long long sz=e.size()-1;
    build(1,0,sz);
    long long last=0;
    for(long long i=1;i<=q;i++)
    {
        long long x,y;
        cin>>x>>y;
        x=(x+last)%(n-1);
        y=(y+last)%w;

        long long v1=a[x+1].first;
        long long v2=a[x+1].second;
        if(d[v1]>d[v2])swap(v1,v2);
        //cout<<"- "<<in[v2]<<" "<<out[v2]<<" "<<-h[x+1]+y<<endl;
        update(1,0,sz,in[v2],out[v2],+h[x+1]-y);
        h[x+1]=y;
        if(n==2)cout<<y<<endl;
        else cout<<t[1].ijk<<endl;
        if(n==2)last=y;
        else last=t[1].ijk;
    }
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	read();
	long long s=1;
	for(long long i=1;i<=n;i++)
        if(v[i].size()>1)s=i;
	dfs(s,0);
	solve();
	return 0;
}
/*
10 10 10000
1 9 1241
5 6 1630
10 5 1630
2 6 853
10 1 511
5 3 760
8 3 1076
4 10 1483
7 10 40
8 2051
5 6294
5 4168
7 1861
0 5244
6 5156
3 3001
8 5267
5 3102
8 3623

4 3 2000
1 2 100
2 3 1000
2 4 1000
2 1030
1 1020
1 890
*/

Compilation message (stderr)

diameter.cpp: In function 'node merge_(node, node)':
diameter.cpp:64:50: error: narrowing conversion of '-1.0e+18' from 'double' to 'long long int' [-Wnarrowing]
   64 |     node ans={-1e18,-1e18,-1e18,-1e18,-1e18,-1e18};
      |                                                  ^
diameter.cpp: In function 'void build(long long int, long long int, long long int)':
diameter.cpp:88:50: error: narrowing conversion of '-1.0e+18' from 'double' to 'long long int' [-Wnarrowing]
   88 |         t[i]={d[f],d[f],-2*d[f],-1e18,-1e18,-1e18};
      |                                                  ^