제출 #887378

#제출 시각아이디문제언어결과실행 시간메모리
887378pccBirthday gift (IZhO18_treearray)C++14
56 / 100
199 ms256372 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #define fs first #define sc second #define tlll tuple<ll,ll,ll> #define mid ((l+r)>>1) const int mxn = 2e5+10; int n,m,q; pii dfn[mxn]; pii sparse[mxn][20]; int dep[mxn]; vector<int> tree[mxn]; vector<int> eul; int arr[mxn]; int ppp = 0; multiset<pair<int,pii>> segtree[mxn*8]; void dfs(int now,int par){ dfn[now].fs = eul.size(); eul.push_back(now); for(auto nxt:tree[now]){ if(nxt == par)continue; dep[nxt] = dep[now]+1; dfs(nxt,now); eul.push_back(now); } dfn[now].sc = eul.size(); eul.push_back(now); } void build(){ for(int i = 0;i<eul.size();i++){ sparse[i][0] = make_pair(dep[eul[i]],eul[i]); } for(int i = 1;i<20;i++){ for(int j = 0;j+(1<<i)<=eul.size();j++)sparse[j][i] = min(sparse[j][i-1],sparse[j+(1<<(i-1))][i-1]); } return; } int anc(int l,int r){ l = dfn[l].fs; r = dfn[r].fs; if(l>r)swap(l,r); int d = r-l+1; int h = __lg(d); return min(sparse[l][h],sparse[r-(1<<h)+1][h]).sc; } void maketree(int now,int l,int r){ if(l == r){ segtree[now].insert(make_pair(arr[l],make_pair(l,l))); return; } maketree(now*2+1,l,mid); maketree(now*2+2,mid+1,r); for(auto &i:segtree[now*2+1])segtree[now].insert(i); for(auto &i:segtree[now*2+2])segtree[now].insert(i); segtree[now].insert({anc(arr[mid],arr[mid+1]),{mid,mid+1}}); //cout<<now<<":"<<l<<' '<<r<<":";for(auto &i:segtree[now])cout<<i.fs<<',';cout<<endl; return; } void modify(int now,int l,int r,int p,int v){ segtree[now].erase(segtree[now].find({arr[p],{p,p}})); segtree[now].insert({v,{p,p}}); if(p != l){ segtree[now].erase(segtree[now].find({anc(arr[p-1],arr[p]),{p-1,p}})); segtree[now].insert({anc(arr[p-1],v),{p-1,p}}); } if(p != r){ segtree[now].erase(segtree[now].find({anc(arr[p],arr[p+1]),{p,p+1}})); segtree[now].insert({anc(arr[p+1],v),{p,p+1}}); } if(l == r)return; if(mid>=p)modify(now*2+1,l,mid,p,v); else modify(now*2+2,mid+1,r,p,v); return; } pii getval(int now,int l,int r,int s,int e,int tar){ if(l>=s&&e>=r){ auto it = segtree[now].lower_bound({tar,{0,0}}); if(it != segtree[now].end()&&it->fs == tar){ return it->sc; } else return {-1,-1}; } if(mid>=e)return getval(now*2+1,l,mid,s,e,tar); else if(mid<s)return getval(now*2+2,mid+1,r,s,e,tar); else{ if(anc(arr[mid],arr[mid+1]) == tar)return {mid,mid+1}; auto re = getval(now*2+1,l,mid,s,e,tar); if(re.fs != -1)return re; else return getval(now*2+2,mid+1,r,s,e,tar); } } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m>>q; for(int i = 1;i<n;i++){ int a,b; cin>>a>>b; tree[a].push_back(b); tree[b].push_back(a); } for(int i = 1;i<=m;i++){ cin>>arr[i]; } dfs(1,1); build(); maketree(0,1,m); //for(auto &i:segtree[0])cout<<i.fs<<' '<<i.sc.fs<<','<<i.sc.sc<<';'; while(q--){ int tp; cin>>tp; if(tp == 1){ int p,v; cin>>p>>v; modify(0,1,m,p,v); arr[p] = v; } else{ int l,r,v; cin>>l>>r>>v; auto re = getval(0,1,m,l,r,v); cout<<re.fs<<' '<<re.sc<<'\n'; } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

treearray.cpp: In function 'void build()':
treearray.cpp:37:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |  for(int i = 0;i<eul.size();i++){
      |                ~^~~~~~~~~~~
treearray.cpp:41:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |   for(int j = 0;j+(1<<i)<=eul.size();j++)sparse[j][i] = min(sparse[j][i-1],sparse[j+(1<<(i-1))][i-1]);
      |                 ~~~~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...