Cod sursă (job #735731)

Utilizator avatar divaddd David Curca divaddd IP ascuns
Problemă Ștampile Compilator cpp-32 | 1,59 kb
Rundă Arhiva de probleme Status evaluat
Dată 5 oct. 2023 00:27:19 Scor 85
#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
const int NMAX = 2e5+2;
int n,m,a[NMAX],l,r,v;
vector<pii> interv[NMAX];

ifstream fin("stampile.in");
ofstream fout("stampile.out");

struct BIT{
    int n;
    vector<int> aib;

    BIT(int _n){
        n = _n;
        aib.resize(n+1);
    }

    void update(int pos, int val){
        for(int i = pos; i <= n; i += (i&-i)){
            aib[i] += val;
        }
    }

    int query(int pos){
        int ans = 0;
        for(int i = pos; i > 0; i -= (i&-i)){
            ans += aib[i];
        }
        return ans;
    }
};

int main()
{
    fin >> n >> m;
    BIT aib(n);
    for(int i = 1; i <= n; i++){
        fin >> a[i];
        aib.update(i, a[i]-a[i-1]);
    }

    for(int i = 1; i <= m; i++){
        fin >> l >> r >> v;
        interv[r].push_back({l, v});
    }
    set<pii> s;
    int ans = 0;
    for(int i = n; i >= 1; i--){
        for(auto it: interv[i]){
            s.insert(it);
        }
        a[i] = aib.query(i);
        while(a[i] > 0){
            auto it = *s.begin();
            s.erase(s.begin());
            int scad = min(a[i], it.second);
            aib.update(it.first, -scad);
            a[i] -= scad;
            ans += scad;
            it.second -= scad;
            if(it.second != 0){
                s.insert(it);
            }
            if(s.size() == 0){
                break;
            }
        }
        if(a[i] > 0){
            fout << "-1\n";
            return 0;
        }
    }
    fout << ans;
    return 0;
}