Submission #607720

#TimeUsernameProblemLanguageResultExecution timeMemory
607720bgnbvnbvBirthday gift (IZhO18_treearray)C++14
100 / 100
859 ms77184 KiB
#include <bits/stdc++.h>
#define prec fixed<<setprecision
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define ll long long
#define ld long double
#define fs first
#define sc second
#define all(x) x.begin(),x.end()
#define endl '\n'
#define taskname "tree"
#define pll pair<long long,long long>
#define pld pair<long double,long double>
#define bpc __builtin_popcount
using namespace std;
const ll inf = 1e9;
const int maxN=2e5+9;
const ll mod=1e9+7;
int n,m,q,a[maxN],lc[maxN],pa,plca;
set<int> ap[maxN],lcp[maxN];//xp[i] = positions of i trong x
vector<int> adj[maxN];
//lca
int tg=0, tin[maxN], tout[maxN];
int up[maxN][19];
void dfs(int v, int p){
    tin[v] = ++tg;
    up[v][0] = p;
    for (int i = 1; i <= 18; ++i)
        up[v][i] = up[up[v][i-1]][i-1];
    for (int u : adj[v])
        if (u != p)
            dfs(u, v);
    tout[v] = ++tg;
}
bool act(int u, int v){
    return tin[u] <= tin[v] && tout[u] >= tout[v];
}
int lca(int u, int v){
    if (act(u, v))return u;
    if (act(v, u))return v;
    for (int i = 18; i >= 0; --i)
        if (!act(up[u][i], v))
            u = up[u][i];
    return up[u][0];
}
//*/
void Init(){
    dfs(1,1);
    for(int i=1;i<=m;i++)cin>>a[i],ap[a[i]].insert(i);
    for(int i=1;i<=m-1;i++)lc[i]=lca(a[i],a[i+1]),lcp[lc[i]].insert(i);
}
void Enter(){
    cin>>n>>m>>q;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
}
void Solve(){
    while(q--){
        ll t,l,r,k;
        cin>>t>>l>>r;
        if(t==2){
            //3 log n
            cin>>k;

            pa=*(ap[k].upper_bound(l-1));
            if(l<=pa&&pa<=r){cout<<pa<<" "<<pa<<endl;continue;}

            plca=*(lcp[k].upper_bound(l-1));
            if(l<=plca&&plca+1<=r){cout<<plca<<" "<<plca+1<<endl;continue;}

            cout<<"-1 -1\n";
        } else {
            //8 log n
            ap[a[l]].erase(l);
            if(l>1)lcp[lc[l-1]].erase(l-1);
            if(l<m)lcp[lc[l]].erase(l);

            a[l]=r;
            if(l>1)lc[l-1]=lca(a[l-1],a[l]);
            if(l<m)lc[l]=lca(a[l],a[l+1]);

            ap[a[l]].insert(l);
            if(l>1)lcp[lc[l-1]].insert(l-1);
            if(l<m)lcp[lc[l]].insert(l);
        }
    }
}
///Read every task 3 times
///Connect with previous task
///Hint in subtasks?
///Re-initialize efficiently
///Array bounds
///Int overflow
///Modulo
///Output
///File?
///Multi-tests?
signed main() {
    cin.tie(nullptr);ios_base::sync_with_stdio(NULL);
    if(fopen(taskname".inp","r")){freopen(taskname".inp","r",stdin);freopen(taskname".out","w",stdout);}
    int t=1;
    //cin>>t;
    //getline(cin,s);
    //Init();
    while (t--){
        //Init();
        Enter();
        Init();
        Solve();
    }
}

Compilation message (stderr)

treearray.cpp: In function 'int main()':
treearray.cpp:108:42: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |     if(fopen(taskname".inp","r")){freopen(taskname".inp","r",stdin);freopen(taskname".out","w",stdout);}
      |                                   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
treearray.cpp:108:76: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |     if(fopen(taskname".inp","r")){freopen(taskname".inp","r",stdin);freopen(taskname".out","w",stdout);}
      |                                                                     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...