Cod sursa(job #2270678)

Utilizator giotoPopescu Ioan gioto Data 27 octombrie 2018 13:09:59
Problema Reconst Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;

int n, m;
int a[2005];
long long aib[2005];
inline void u(int p, int v){
    for(int i = p; i <= n ; i = i + (i & (-i)))
        aib[i] += v;
}
inline long long q(int p){
    long long val = 0;
    for(int i = p; i > 0 ; i = i - (i & (-i)))
        val += aib[i];
    return val;
}
struct usu{
    int x, y, c;
    bool operator < (const usu &aux)const{
        if(x != aux.x) return x < aux.x;
        return y < aux.y;
    }
};
set <usu> s;
int main()
{
    freopen("reconst.in", "r", stdin);
    freopen("reconst.out", "w", stdout);

    scanf("%d%d", &n, &m);
    int x, y, c;
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d%d", &x, &y, &c);
        s.insert({x, y, c});
    }

    set <usu> :: iterator it = s.begin();
    while(it != s.end()){
        set <usu> :: iterator it2 = next(it);
        int x = it->x;
        while(it2 != s.end()){
            if(it2->x != x) break ;
            int y = it2->y;
            s.insert({it->y + 1, it2->y, it2->c - it->c});
            s.erase(it2);
            it2 = s.lower_bound({x, y, 0});
        }
        it = it2;
    }

    for(set <usu> :: reverse_iterator it = s.rbegin(); it != s.rend() ; ++it){
        int val = q(it->y) - q(it->x - 1);
        a[it->x] = it->c - val;
        u(it->x, a[it->x]);
    }

    for(int i = 1; i <= n ; ++i)
        printf("%d ", a[i]);

    return 0;
}