Submission #1104924

# Submission time Handle Problem Language Result Execution time Memory
1104924 2024-10-24T17:58:32 Z Irate Meteors (POI11_met) C++17
100 / 100
1733 ms 65536 KB
#include<bits/stdc++.h>
using namespace std;
const int LOG = 20;
struct Query{
    int l, r, a;
};
struct T{
    int l, r, ans = -1;
};
struct BIT{
    vector<long long>fen;
    int sz;
    BIT(int n){
        sz = n;
        fen.resize(n + 1);
    }
    void Update(int pos, int val){
        while(pos <= sz){
            fen[pos] += val;
            pos += (pos & -pos);
        }
    }
    long long Sum(int pos){
        long long sum = 0;
        while(pos > 0){
            sum += fen[pos];
            pos -= (pos & -pos);
        }
        return sum;
    }
};
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> m >> n;
    vector<int>v(n + 1), need(m + 1);
    vector<vector<int>>pos(m + 1);
    vector<T>intervals(m + 1);
    for(int i = 1;i <= n;++i){
        cin >> v[i];
        pos[v[i]].push_back(i);
    }
    for(int i = 1;i <= m;++i){
        cin >> need[i];
    }
    int q;
    cin >> q;
    vector<vector<int>>timeline(q);
    vector<Query>queries(q);
    for(int i = 1;i <= m;++i){
        timeline[(q - 1) / 2].push_back(i);
        intervals[i] = {0, q - 1};
    }
    for(int i = 0;i < q;++i){
        int l, r, a;
        cin >> l >> r >> a;
        queries[i] = {l, r, a};
    }
    for(int i = 0;i < LOG;++i){
        BIT tree(n + 1);
        for(int j = 0;j < q;++j){
            int l = queries[j].l, r = queries[j].r, a = queries[j].a;
            if(l <= r){
                tree.Update(l, a);
                tree.Update(r + 1, -a);
            }
            else{
                tree.Update(l, a);
                tree.Update(n + 1, -a);
                tree.Update(1, a);
                tree.Update(r + 1, -a);
            }
            while(!timeline[j].empty()){
                int base = timeline[j].back();
                timeline[j].pop_back();
                l = intervals[base].l, r = intervals[base].r;
                int ans = intervals[base].ans;
                long long tot = 0;
                for(int &p : pos[base]){
                    tot += tree.Sum(p);
                    if(tot >= need[base]){
                        break;
                    }
                }
                if(tot >= need[base]){
                    intervals[base] = {l, (l + r) / 2 - 1, (l + r) / 2};
                }
                else{
                    intervals[base] = {(l + r) / 2 + 1, r, ans};
                }
            }
        }
        for(int j = 1;j <= m;++j){
            timeline[(intervals[j].l + intervals[j].r) / 2].push_back(j);
        }
    }
    for(int i = 1;i <= m;++i){
        int ans = intervals[i].ans;
        if(ans < 0){
            cout << "NIE\n";
        }
        else{
            cout << ans + 1 << '\n';
        }
    }
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 2 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 336 KB Output is correct
2 Correct 2 ms 336 KB Output is correct
3 Correct 2 ms 592 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 54 ms 3520 KB Output is correct
2 Correct 104 ms 6080 KB Output is correct
3 Correct 90 ms 5568 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 89 ms 4808 KB Output is correct
2 Correct 84 ms 4808 KB Output is correct
3 Correct 114 ms 6336 KB Output is correct
4 Correct 26 ms 3272 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 61 ms 4032 KB Output is correct
2 Correct 80 ms 6848 KB Output is correct
3 Correct 37 ms 2128 KB Output is correct
4 Correct 87 ms 6080 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 94 ms 3136 KB Output is correct
2 Correct 100 ms 4796 KB Output is correct
3 Correct 58 ms 3272 KB Output is correct
4 Correct 104 ms 7580 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1164 ms 30660 KB Output is correct
2 Correct 721 ms 15684 KB Output is correct
3 Correct 167 ms 11592 KB Output is correct
4 Correct 1378 ms 60952 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1010 ms 29016 KB Output is correct
2 Correct 631 ms 15824 KB Output is correct
3 Correct 140 ms 10960 KB Output is correct
4 Correct 1733 ms 65536 KB Output is correct