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...