Submission #1104929

#TimeUsernameProblemLanguageResultExecution timeMemory
1104929Irate새로운 문제 (POI11_met)C++17
100 / 100
772 ms28604 KiB
#include<bits/stdc++.h>
using namespace std;
const int mxN = 3e5 + 5;
long long fen[mxN];
vector<int> pos[mxN];
int sectors[mxN], need[mxN], ans[mxN];
int P = -1, n, m, q;
void Update(int pos, int val){
    while(pos < mxN){
        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;
}
struct Query{
    int l, r, a;
} queries[mxN];
void f(int l, int r, vector<int>&exist){
    int mid = (l + r) / 2;
    if(mid == q){
        for(int &sector : exist){
            ans[sector] = -1;       
        }
        return;
    }
    if(l == r){
        for(int &sector : exist){
            ans[sector] = l;
        }
        return;
    }
    while(P + 1 <= mid){
        P++;
        int l = queries[P].l, r = queries[P].r, a = queries[P].a;
        if(l <= r){
            Update(l, a);
            Update(r + 1, -a);
        }
        else{
            Update(l, a);
            Update(1, a);
            Update(r + 1, -a);
        }
    }
    while(P - 1 >= mid){
        int l = queries[P].l, r = queries[P].r, a = queries[P].a;
        if(l <= r){
            Update(l, -a);
            Update(r + 1, a);
        }
        else{
            Update(l, -a);
            Update(1, -a);
            Update(r + 1, a);
        }
        P--;
    }
    vector<int>left, right;
    for(int &sector : exist){
        long long tot = 0;
        for(int &i : pos[sector]){
            tot += Sum(i);
            if(tot >= need[sector]){
                break;
            }
        }
        if(tot >= need[sector]){
            left.push_back(sector);
        }
        else{
            right.push_back(sector);
        }
    }
    f(l, mid, left);
    f(mid + 1, r, right);
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n;
    for(int i = 1;i <= n;++i){
        cin >> sectors[i];
        pos[sectors[i]].push_back(i);
    }
    vector<int>exist;
    for(int i = 1;i <= m;++i){
        cin >> need[i];
        exist.push_back(i);
    }
    cin >> q;
    for(int i = 0;i < q;++i){
        int l, r, a;
        cin >> l >> r >> a;
        queries[i] = {l, r, a};
    }
    f(0, q, exist);
    for(int i = 1;i <= m;++i){
        if(ans[i] < 0){
            cout << "NIE\n";
        }
        else{
            cout << ans[i] + 1 << '\n';
        }
    }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...