Cod sursa(job #2021242)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 12 septembrie 2017 22:14:23
Problema Reconst Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
#define r first
#define val second

const int MAXN = (int) 2e3;

struct Query {
    int l, r;
    int val;
    bool operator <(const Query &other) const {
         if(l == other.l)
            return r < other.r;
         return l < other.l;
    }
};

std::multiset <Query> mst;

std::pair <int, int> pos[MAXN + 1];

int sol[MAXN + 1];

int main() {
    FILE *fi, *fout;
    int i, j, n, m, l, r, val;
    fi = fopen("reconst.in" ,"r");
    fout = fopen("reconst.out" ,"w");
    fscanf(fi,"%d %d " ,&n,&m);
    for(i = 1; i <= m; i++) {
        fscanf(fi,"%d %d %d " ,&l,&r,&val);
        mst.insert({l, r, val});
    }
    for(i = 1; i <= n; i++) {
        std::multiset <Query> :: iterator it = mst.begin();
        if(it -> l == i) {
            Query aux = *it;
            it++;
            while(it != mst.end() && it -> l == i) {
                if(it -> r != aux.r && aux.r < n) {
                    mst.insert({aux.r + 1, it -> r, it -> val - aux.val});
                }
                it++;
            }
            it = mst.begin();
            pos[i] = {it -> r, it -> val};
            while(!mst.empty() && mst.begin() -> l == i)
                mst.erase(mst.begin());
        }
    }
    for(i = n; i >= 1; i--) {
        if(pos[i].r > 0) {
            int sum = 0;
            for(j = i + 1; j <= pos[i].r; j++)
               sum += sol[j];
            sol[i] = pos[i].val - sum;
        }
    }
    for(i = 1; i <= n; i++)
        fprintf(fout,"%d " ,sol[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}