Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cassert>
- #define FOR(i, k, n) for(int i = k ; i < n ; i++)
- typedef long long int lld ;
- // CODE FROM HERE
- const int MAX = 11111 ;
- lld mod = 1000000007 ;
- std::vector <std::vector <lld>> edges(MAX) ;
- lld n ;
- std::vector <lld> ans ;
- void getEdgeDistances(lld v, lld dis){
- ans.push_back(dis) ;
- assert(ans.size() <= n) ;
- for(auto itr : edges[v]){
- getEdgeDistances(itr, (dis + 1)) ;
- }
- return ;
- }
- lld moduloExpo(lld x, lld y){ // x^y
- lld res = 1 ;
- while(y){
- if(y&1)
- res = (lld)(res*x)%mod ;
- x = (lld)(x*x)%mod ;
- y >>= 1ll ;
- }
- return res%mod ;
- }
- int main(){
- lld t, u, q, a, b, v ;
- std::cin >> t ;
- while(t--){
- ans.clear() ;
- std::cin >> n >> q ;
- FOR(i, 0, n + 20){
- edges[i].clear() ;
- }
- FOR(i, 0, n - 1){
- std::cin >> u >> v ;
- edges[u].push_back(v) ;
- }
- lld answer = 0, y ;
- FOR(i, 0, q){
- std::cin >> a >> b ;
- v = a^answer ;
- y = b^answer ;
- ans.clear() ;
- getEdgeDistances(v, 0) ;
- std::sort(ans.begin(), ans.end()) ;
- answer = 0 ;
- FOR(i, 0, ans.size()){
- answer += (lld)(ans[i]*moduloExpo(y, i)) ;
- answer %= mod ;
- }
- std::cout << answer << "\n" ;
- }
- }
- }
Add Comment
Please, Sign In to add comment