Submission #856752

# Submission time Handle Problem Language Result Execution time Memory
856752 2023-10-04T12:40:29 Z bkhanh Two Currencies (JOI23_currencies) C++14
100 / 100
3194 ms 49704 KB
#include<bits/stdc++.h>
using namespace std;    

namespace Solve
{
    #define int long long
    const int M = 1e5 + 1;
    const int Srt = 400;

    typedef tuple<long long, long long, long long> ox;
    vector<ox> idVal;

    long long ans[M];
    
    struct Node
    {
        int nxt, id;
    };

    struct Query
    {
        long long Comp, id, x, y, z, w;

        bool operator < (const Query that)
        {
            if(Comp != that.Comp) return Comp < that.Comp;
            if(y != that.y) return y < that.y;
            return x < that.x;
        }
    };

    vector<Query> List;
    int vis[2000001];
    vector<int> list[M];
    int h[M], par[M][21];
    int timeIn[M], timeOut[M];
    vector<long long> valRag;
    int timeDFS;

    long long Sum[2000001];
    long long node[2000001];
    int pos[M];

    vector<Node> adj[M];

    void DFS(int u, int par)
    {
        h[u] = h[par] + 1;
        timeIn[u] = timeDFS++;
        pos[u] = valRag.size();

        for(auto info: adj[u])
        {
            if(info.nxt != par)
            {
                for(auto c: list[info.id]) valRag.push_back(c);
                DFS(info.nxt, u);
                for(auto c: list[info.id]) valRag.push_back(c);
            }
        }

        timeOut[u] = timeDFS;
    }

    void Update(int pos, long long val)
    {
        pos += (1 << 17);

        while(pos)
        {
            Sum[pos] += val;
            node[pos] += val > 0 ? 1 : -1;
            pos /= 2;
        }
    }

    void Up(int id)
    {
        if(!vis[id])
        {
            Update(id, get<0>(idVal[id]));
        }
        else
        {
            Update(id, -get<0>(idVal[id]));
        }

        vis[id] ^= 1;
    }

    long long cal(int id, long long val)
    {
        if(id >= (1 << 17))
        {
            return 0;
        }

        if(Sum[id * 2] <= val) return cal(id * 2 + 1, val - Sum[2 * id]) + node[2 * id];
        else return cal(id * 2, val);
    }

    void solve()
    {
        int n, m, q;
        cin >> n >> m >> q;

        for(int i = 1; i < n; i++)
        {
            int u, v;
            cin >> u >> v;
            adj[u].push_back({v, i});
            adj[v].push_back({u, i});
        }

        for(int i = 1; i <= m; i++)
        {
            long long id, c;
            cin >> id >> c;

            idVal.push_back({c, id, list[id].size()});
            list[id].push_back(c);
        }

        idVal.push_back({0, -1, -1});
        sort(idVal.begin(), idVal.end());

        for(int i = 1; i < idVal.size(); i++)
        {
            auto t = idVal[i];
            list[get<1>(t)][get<2>(t)] = i;
        }

        DFS(1, 1);

        for(int i = 1; i <= q; i++)
        {
            int x, y, z, w;
            cin >> x >> y >> z >> w;

            x = pos[x];
            y = pos[y];

            if(x > y) swap(x, y);

            List.push_back({x / Srt, i, x, y, z, w});
        }

        memset(ans, -1, sizeof ans);
        sort(List.begin(), List.end());

        int l = 0, r = 0;

        for(auto info: List)
        {
            while(l < info.x)
            {
                Up(valRag[l]);
                l++;
            }

            while(info.x < l)
            {
                l--;
                Up(valRag[l]);
            }

            while(r < info.y)
            {
                Up(valRag[r]);
                r++;
            }

            while(info.y < r)
            {
                r--;
                Up(valRag[r]);
            }

            long long Val = cal(1, info.w);

            if(node[1] > info.z + Val)
            {
                ans[info.id] = -1;
            }
            else
            {
                ans[info.id] = info.z + Val - node[1];
            }
        }

        
        for(int i = 1; i <= q; i++) cout << ans[i] << '\n';
    }
}

main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve::solve();
}

Compilation message

currencies.cpp: In function 'void Solve::solve()':
currencies.cpp:127:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::tuple<long long int, long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |         for(int i = 1; i < idVal.size(); i++)
      |                        ~~^~~~~~~~~~~~~~
currencies.cpp: At global scope:
currencies.cpp:196:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  196 | main()
      | ^~~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 19032 KB Output is correct
2 Correct 3 ms 19036 KB Output is correct
3 Correct 3 ms 17080 KB Output is correct
4 Correct 3 ms 19188 KB Output is correct
5 Correct 8 ms 19516 KB Output is correct
6 Correct 11 ms 19548 KB Output is correct
7 Correct 10 ms 19544 KB Output is correct
8 Correct 11 ms 19548 KB Output is correct
9 Correct 11 ms 19552 KB Output is correct
10 Correct 11 ms 19564 KB Output is correct
11 Correct 11 ms 19384 KB Output is correct
12 Correct 11 ms 19548 KB Output is correct
13 Correct 10 ms 19744 KB Output is correct
14 Correct 9 ms 19544 KB Output is correct
15 Correct 11 ms 19548 KB Output is correct
16 Correct 10 ms 19548 KB Output is correct
17 Correct 13 ms 19548 KB Output is correct
18 Correct 10 ms 19616 KB Output is correct
19 Correct 11 ms 19792 KB Output is correct
20 Correct 10 ms 19548 KB Output is correct
21 Correct 10 ms 19556 KB Output is correct
22 Correct 10 ms 19548 KB Output is correct
23 Correct 5 ms 19548 KB Output is correct
24 Correct 5 ms 19548 KB Output is correct
25 Correct 5 ms 19548 KB Output is correct
26 Correct 5 ms 19548 KB Output is correct
27 Correct 4 ms 19548 KB Output is correct
28 Correct 7 ms 19548 KB Output is correct
29 Correct 6 ms 19548 KB Output is correct
30 Correct 11 ms 19544 KB Output is correct
31 Correct 11 ms 19544 KB Output is correct
32 Correct 11 ms 19548 KB Output is correct
33 Correct 12 ms 19768 KB Output is correct
34 Correct 9 ms 19772 KB Output is correct
35 Correct 10 ms 19760 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 19032 KB Output is correct
2 Correct 11 ms 19548 KB Output is correct
3 Correct 11 ms 19548 KB Output is correct
4 Correct 11 ms 19800 KB Output is correct
5 Correct 2255 ms 35372 KB Output is correct
6 Correct 2001 ms 34416 KB Output is correct
7 Correct 1442 ms 34288 KB Output is correct
8 Correct 1230 ms 33920 KB Output is correct
9 Correct 1393 ms 33948 KB Output is correct
10 Correct 2876 ms 37412 KB Output is correct
11 Correct 2966 ms 37580 KB Output is correct
12 Correct 2871 ms 39528 KB Output is correct
13 Correct 2893 ms 37492 KB Output is correct
14 Correct 2828 ms 38264 KB Output is correct
15 Correct 2114 ms 49348 KB Output is correct
16 Correct 2210 ms 49704 KB Output is correct
17 Correct 1082 ms 46764 KB Output is correct
18 Correct 2674 ms 37500 KB Output is correct
19 Correct 2718 ms 37412 KB Output is correct
20 Correct 2680 ms 37476 KB Output is correct
21 Correct 2342 ms 38832 KB Output is correct
22 Correct 2329 ms 38380 KB Output is correct
23 Correct 2358 ms 38460 KB Output is correct
24 Correct 2358 ms 37332 KB Output is correct
25 Correct 457 ms 38004 KB Output is correct
26 Correct 377 ms 39008 KB Output is correct
27 Correct 202 ms 38672 KB Output is correct
28 Correct 107 ms 37236 KB Output is correct
29 Correct 142 ms 37408 KB Output is correct
30 Correct 2344 ms 37504 KB Output is correct
31 Correct 2342 ms 39396 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 16988 KB Output is correct
2 Correct 10 ms 19548 KB Output is correct
3 Correct 10 ms 19548 KB Output is correct
4 Correct 9 ms 19544 KB Output is correct
5 Correct 582 ms 43608 KB Output is correct
6 Correct 452 ms 43892 KB Output is correct
7 Correct 944 ms 39748 KB Output is correct
8 Correct 1173 ms 49280 KB Output is correct
9 Correct 1156 ms 47948 KB Output is correct
10 Correct 1170 ms 47948 KB Output is correct
11 Correct 317 ms 48244 KB Output is correct
12 Correct 361 ms 48292 KB Output is correct
13 Correct 360 ms 47484 KB Output is correct
14 Correct 110 ms 48996 KB Output is correct
15 Correct 116 ms 49272 KB Output is correct
16 Correct 777 ms 47984 KB Output is correct
17 Correct 802 ms 48364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 19032 KB Output is correct
2 Correct 3 ms 19036 KB Output is correct
3 Correct 3 ms 17080 KB Output is correct
4 Correct 3 ms 19188 KB Output is correct
5 Correct 8 ms 19516 KB Output is correct
6 Correct 11 ms 19548 KB Output is correct
7 Correct 10 ms 19544 KB Output is correct
8 Correct 11 ms 19548 KB Output is correct
9 Correct 11 ms 19552 KB Output is correct
10 Correct 11 ms 19564 KB Output is correct
11 Correct 11 ms 19384 KB Output is correct
12 Correct 11 ms 19548 KB Output is correct
13 Correct 10 ms 19744 KB Output is correct
14 Correct 9 ms 19544 KB Output is correct
15 Correct 11 ms 19548 KB Output is correct
16 Correct 10 ms 19548 KB Output is correct
17 Correct 13 ms 19548 KB Output is correct
18 Correct 10 ms 19616 KB Output is correct
19 Correct 11 ms 19792 KB Output is correct
20 Correct 10 ms 19548 KB Output is correct
21 Correct 10 ms 19556 KB Output is correct
22 Correct 10 ms 19548 KB Output is correct
23 Correct 5 ms 19548 KB Output is correct
24 Correct 5 ms 19548 KB Output is correct
25 Correct 5 ms 19548 KB Output is correct
26 Correct 5 ms 19548 KB Output is correct
27 Correct 4 ms 19548 KB Output is correct
28 Correct 7 ms 19548 KB Output is correct
29 Correct 6 ms 19548 KB Output is correct
30 Correct 11 ms 19544 KB Output is correct
31 Correct 11 ms 19544 KB Output is correct
32 Correct 11 ms 19548 KB Output is correct
33 Correct 12 ms 19768 KB Output is correct
34 Correct 9 ms 19772 KB Output is correct
35 Correct 10 ms 19760 KB Output is correct
36 Correct 3 ms 19032 KB Output is correct
37 Correct 11 ms 19548 KB Output is correct
38 Correct 11 ms 19548 KB Output is correct
39 Correct 11 ms 19800 KB Output is correct
40 Correct 2255 ms 35372 KB Output is correct
41 Correct 2001 ms 34416 KB Output is correct
42 Correct 1442 ms 34288 KB Output is correct
43 Correct 1230 ms 33920 KB Output is correct
44 Correct 1393 ms 33948 KB Output is correct
45 Correct 2876 ms 37412 KB Output is correct
46 Correct 2966 ms 37580 KB Output is correct
47 Correct 2871 ms 39528 KB Output is correct
48 Correct 2893 ms 37492 KB Output is correct
49 Correct 2828 ms 38264 KB Output is correct
50 Correct 2114 ms 49348 KB Output is correct
51 Correct 2210 ms 49704 KB Output is correct
52 Correct 1082 ms 46764 KB Output is correct
53 Correct 2674 ms 37500 KB Output is correct
54 Correct 2718 ms 37412 KB Output is correct
55 Correct 2680 ms 37476 KB Output is correct
56 Correct 2342 ms 38832 KB Output is correct
57 Correct 2329 ms 38380 KB Output is correct
58 Correct 2358 ms 38460 KB Output is correct
59 Correct 2358 ms 37332 KB Output is correct
60 Correct 457 ms 38004 KB Output is correct
61 Correct 377 ms 39008 KB Output is correct
62 Correct 202 ms 38672 KB Output is correct
63 Correct 107 ms 37236 KB Output is correct
64 Correct 142 ms 37408 KB Output is correct
65 Correct 2344 ms 37504 KB Output is correct
66 Correct 2342 ms 39396 KB Output is correct
67 Correct 3 ms 16988 KB Output is correct
68 Correct 10 ms 19548 KB Output is correct
69 Correct 10 ms 19548 KB Output is correct
70 Correct 9 ms 19544 KB Output is correct
71 Correct 582 ms 43608 KB Output is correct
72 Correct 452 ms 43892 KB Output is correct
73 Correct 944 ms 39748 KB Output is correct
74 Correct 1173 ms 49280 KB Output is correct
75 Correct 1156 ms 47948 KB Output is correct
76 Correct 1170 ms 47948 KB Output is correct
77 Correct 317 ms 48244 KB Output is correct
78 Correct 361 ms 48292 KB Output is correct
79 Correct 360 ms 47484 KB Output is correct
80 Correct 110 ms 48996 KB Output is correct
81 Correct 116 ms 49272 KB Output is correct
82 Correct 777 ms 47984 KB Output is correct
83 Correct 802 ms 48364 KB Output is correct
84 Correct 2606 ms 34396 KB Output is correct
85 Correct 2203 ms 33552 KB Output is correct
86 Correct 1184 ms 32888 KB Output is correct
87 Correct 3191 ms 37424 KB Output is correct
88 Correct 3194 ms 39176 KB Output is correct
89 Correct 3120 ms 38748 KB Output is correct
90 Correct 3090 ms 37832 KB Output is correct
91 Correct 3130 ms 39284 KB Output is correct
92 Correct 1412 ms 44540 KB Output is correct
93 Correct 1212 ms 46392 KB Output is correct
94 Correct 2991 ms 37948 KB Output is correct
95 Correct 2941 ms 39596 KB Output is correct
96 Correct 3023 ms 38664 KB Output is correct
97 Correct 2884 ms 37452 KB Output is correct
98 Correct 2919 ms 38452 KB Output is correct
99 Correct 2909 ms 36728 KB Output is correct
100 Correct 2932 ms 36896 KB Output is correct
101 Correct 2929 ms 36736 KB Output is correct
102 Correct 219 ms 39024 KB Output is correct
103 Correct 249 ms 38520 KB Output is correct
104 Correct 730 ms 37260 KB Output is correct
105 Correct 113 ms 37820 KB Output is correct
106 Correct 116 ms 37444 KB Output is correct
107 Correct 2421 ms 38260 KB Output is correct
108 Correct 2460 ms 39152 KB Output is correct