Submission #1363462

#TimeUsernameProblemLanguageResultExecution timeMemory
1363462sophiaeternaliaTourists (EGOI22_tourists)C++20
0 / 100
4094 ms348 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int int64_t

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vector<pair<int, int>> o;
vector<int> h;
vector<vector<int>> p, g;
int in;

bool pa(int pp, int c){
    if (o[pp].first<=o[c].first and o[c].second<=o[pp].second){
        return true;
    }
    return false;
}

int lca(int v, int u, int ind){
    if (v==u){
        return u;
    }
    if (h[v]>h[u]){
        swap(v, u);
    }
    if (pa(v, u)){
        return v;
    }
    int pv=p[v][0];
    if (pa(pv, u)){
        return pv;
    }
    while (ind>=p[v].size()){
        ind=p[v].size()-1;
    }
    while (pa(p[v][ind], u)){
        ind--;
    }
    return lca(p[v][ind], u, ind);
}

void dfs(int v, int la){
    if (la!=-1){
        h[v]=h[la]+1;
    }
    o[v].first=in++;
    p[v].push_back(la);
    while (p[p[v][p[v].size()-1]].size()>=p[v].size()){
        int a=p[v].size();
        p[v].push_back(p[p[v][a]][a]);
    }
    for (auto u: g[v]){
        if (u!=la){
            dfs(u, v);
        }
    }
    o[v].second=in++;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

vector<int> stsc, stpo;
vector<array<int, 2>> stch;
int sts;

void pro(int v){
    if (v>=sts){
        return;
    } else {
        stsc[2*v]+=stsc[v];
        stsc[2*v+1]+=stsc[v];
        stsc[v]=0;
        int a=stch[v][0];
        if (a!=1e9){
            stch[2*v][0]=a;
            stch[2*v+1][0]=a;
        }
        a=stch[v][1];
        if (a!=-1e9){
            stch[2*v][1]=a;
            stch[2*v+1][1]=a;
        }
        stch[v]={(int)1e9, (int)-1e9};
        if (stpo[v]!=-1){
            stpo[2*v]=stpo[v];
            stpo[2*v+1]=stpo[2*v];
        }
        stpo[v]=-1;
    }
}

void upo(int l, int r, int ql, int qr, int v, int va){
    pro(v);
    if (r<ql or qr<l){
        return;
    } else if (ql<=l and r<=qr){
        stpo[v]=va;
    } else {
        upo(l, (l+r)/2, ql, qr, 2*v, va);
        upo((l+r)/2+1, r, ql, qr, 2*v+1, va);
    }
}

int qpo(int l, int r, int v, int i){
    pro(v);
    if (l==r and l==i){
        return stpo[v];
    } else if (i<l or i>r){
        return 0;
    } else {
        return qpo(l, (l+r)/2, 2*v, i)+qpo((l+r)/2+1, r, 2*v+1, i);
    }
}

void uch(int l, int r, int ql, int qr, int v, int cl, int cr){
    pro(v);
    if (r<ql or qr<l){
        return;
    } else if (ql<=l and r<=qr){
        stch[v]={cl, cr};
    } else {
        uch(l, (l+r)/2, ql, qr, 2*v, cl, cr);
        uch((l+r)/2+1, r, ql, qr, 2*v+1, cl, cr);
    }
}

array<int, 2> qch(int l, int r, int v, int i){
    pro(v);
    if (l==r and l==i){
        return stch[v];
    } else if (i<l or i>r){
        return {(int)1e9, (int)-1e9};
    } else {
        array<int, 2> a=qch(l, (l+r)/2, 2*v, i), b=qch((l+r)/2+1, r, 2*v+1, i), c;
        c[0]=min(a[0], b[0]);
        c[01]=max(a[1], b[1]);
        return c;
    }
}

void usc(int l, int r, int ql, int qr, int v, int va){
    pro(v);
    if (r<ql or qr<l){
        return;
    } else if (ql<=l and r<=qr){
        stsc[v]+=va;
    } else {
        usc(l, (l+r)/2, ql, qr, 2*v, va);
        usc((l+r)/2+1, r, ql, qr, 2*v+1, va);
    }
}

int qsc(int l, int r, int v, int i){
    pro(v);
    if (l==r and l==i){
        return stsc[v];
    } else if (i<l or i>r){
        return 0;
    } else {
        return qsc(l, (l+r)/2, 2*v, i)+qsc((l+r)/2+1, r, 2*v+1, i);
    }
}

signed main(){
    //cin.tie(0); ios_base::sync_with_stdio(NULL);

    int n, m, q;
    cin>>n>>m>>q;
    sts=1<<(int)ceil(log2(m));
    stch.assign(2*sts, {(int)1e9, (int)-1e9});
    stsc.assign(2*sts, 0);
    for (int i=sts; i<sts+m; i++){
        stch[i]={i-sts, i-sts};
    }
    stpo.assign(2*sts, -1);
    for (int i=sts; i<sts+m; i++){
        int a;
        cin>>a;
        a--;
        stpo[i]=a;
    }

    //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    in=0;
    o.resize(n);
    h.assign(n, 0);
    p.resize(n);
    g.resize(n);
    for (int i=0; i<n-1; i++){
        int a, b;
        cin>>a>>b;
        a--;
        b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs(0, -1);
    int mind=100;
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    for (int i=0; i<q; i++){
        char cha;
        cin>>cha;
        if (cha=='q'){
            int x;
            cin>>x;
            x--;
            cout<<qsc(0, sts-1, 1, x)<<"\n";
            continue;
        }
        int x, y, w;
        cin>>x>>y>>w;
        x--;
        y--;
        w--;
        if (x!=0){
            int xx=qch(0, sts-1, 1, x-1)[0];
            uch(0, sts-1, xx, x-1, 1, xx, x-1);
        }
        if (y!=m-1){
            int yy=qch(0, sts-1, 1, y+1)[1];
            uch(0, sts-1, y+1, yy, 1, y+1, yy);
        }
        int inde=x;
        while (inde<=y){
            /*for (auto u: stch){
                cout<<u[1]<<" ";
            }
            cout<<"\n";*/
            int le=inde, ri;
            int aaa=qch(0, sts-1, 1, inde)[1];
            ri=min(aaa, y);
            //cout<<i<<": "<<aaa<<" "<<x<<" "<<y<<" "<<le<<" "<<ri<<"\n";
            int poo=qpo(0, sts-1, 1, le);
            int an=lca(poo, w, mind);
            int dsc=h[poo]+h[w]-2*h[an];
            usc(0, sts-1, le, ri, 1, -dsc);
            inde=ri+1;
        }
        uch(0, sts-1, x, y, 1, x, y);
        upo(0, sts-1, x, y, 1, w);
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...