제출 #964647

#제출 시각아이디문제언어결과실행 시간메모리
964647yellowtoadSprinkler (JOI22_sprinkler)C++17
41 / 100
4070 ms84560 KiB
#include <iostream> #include <vector> #define f first #define s second #define int long long using namespace std; int n, mod, a[200050], cnt, test, p[200050]; pair<int,int> rng[200050], grp[200050]; vector<int> edge[200050], d[200050], node[200050]; bool up; void dfs(int u, int v, int depth) { p[u] = v; rng[u].f = ++cnt; grp[u] = {depth,d[depth].size()}; d[depth].push_back(u); for (int i = 0; i < edge[u].size(); i++) if (edge[u][i] != v) dfs(edge[u][i],u,depth+1); rng[u].s = cnt; } void build(int i, int id, int x, int y) { if (x == y) { node[i][id] = a[d[i][x]]; return; } int mid = (x+y)/2; build(i,id*2,x,mid); build(i,id*2+1,mid+1,y); node[i][id] = 1; } void update(int i, int id, int x, int y, int l, int r, int val) { if ((l <= x) && (y <= r)) { (node[i][id] *= val) %= mod; return; } if ((y < l) || (r < x)) return; int mid = (x+y)/2; (node[i][id*2] *= node[i][id]) %= mod; (node[i][id*2+1] *= node[i][id]) %= mod; node[i][id] = 1; update(i,id*2,x,mid,l,r,val); update(i,id*2+1,mid+1,y,l,r,val); } int query(int i, int id, int x, int y, int pos) { if (x == y) return node[i][id]; int mid = (x+y)/2; (node[i][id*2] *= node[i][id]) %= mod; (node[i][id*2+1] *= node[i][id]) %= mod; node[i][id] = 1; if (pos <= mid) return query(i,id*2,x,mid,pos); else return query(i,id*2+1,mid+1,y,pos); } signed main() { cin >> n >> mod; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; edge[u].push_back(v); edge[v].push_back(u); } for (int i = 1; i <= n; i++) cin >> a[i]; dfs(1,0,1); for (int i = 1; i <= n; i++) { if (d[i].size()) { node[i].resize(d[i].size()*4+10); build(i,1,0,d[i].size()-1); } } cin >> test; while (test--) { int type, u, dis, val, depth, l, r, ll, rr; cin >> type; if (type == 1) { cin >> u >> dis >> val; depth = grp[u].f+dis; up = 0; while (depth >= grp[u].f) { l = 0; r = (int)d[depth].size()-1; while (l <= r) { int mid = (l+r)/2; if (rng[d[depth][mid]].f < rng[u].f) l = mid+1; else r = mid-1; } ll = l; l = 0; r = (int)d[depth].size()-1; while (l <= r) { int mid = (l+r)/2; if (rng[d[depth][mid]].f > rng[u].s) r = mid-1; else l = mid+1; } rr = r; if (ll <= rr) update(depth,1,0,d[depth].size()-1,ll,rr,val); if ((up) && (p[u])) u = p[u]; up = 1-up; depth--; } } else { cin >> u; cout << query(grp[u].f,1,0,d[grp[u].f].size()-1,grp[u].s) << endl; } } }

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

sprinkler.cpp: In function 'void dfs(long long int, long long int, long long int)':
sprinkler.cpp:18:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |  for (int i = 0; i < edge[u].size(); i++) if (edge[u][i] != v) dfs(edge[u][i],u,depth+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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...