3 条题解

  • 1

    已屏蔽张子瑞

  • 1

    求赞

  • 1

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int MAX = 1000000 + 2;
    using namespace std;
    int tree[MAX * 8];
    int data[MAX];
    int lazy[MAX * 8];
    int n, m, tot;
    void check(int rt)
    {
    if(tree[rt] < 0)
    {
    printf("-1\n%d", tot);
    exit(0);
    }
    }
    void up(int rt)
    {
    tree[rt] = min(tree[rt << 1] , tree[rt << 1 | 1]);
    check(rt);
    }
    void built(int l, int r, int rt)
    {
    if(l == r)
    {
    tree[rt] = data[l];
    return;
    }
    int m = l + (r - l) / 2;
    built(l, m, rt << 1);
    built(m + 1, r, rt << 1 | 1);
    up(rt);
    }
    void down(int rt, int L, int R)
    {
    if(lazy[rt])
    {
    int m = L + (R - L) / 2;

    lazy[rt * 2] += lazy[rt];
    lazy[rt * 2 + 1] += lazy[rt];
    tree[rt * 2] -= lazy[rt];
    tree[rt * 2 + 1] -= lazy[rt];
    lazy[rt] = 0;
    }
    }
    void modify(int L, int R, int l, int r, int val, int rt)
    {

    if(L >= l && R <= r)
    {
    tree[rt] -= val;
    check(rt);
    lazy[rt] += val;
    return;
    }
    check(rt);
    down(rt, L, R);
    int m = L + (R - L) / 2;
    if(m >= l) modify(L, m, l, r, val, rt * 2);
    if(m < r) modify(m + 1, R, l, r, val, rt * 2 + 1);
    up(rt);
    }
    void solve(int n, int m)
    {
    int a, b, c;
    for(int i = 1; i <= m; i++)
    {
    tot = i;
    scanf("%d %d %d", &c, &a, &b);
    modify(1, n, a, b, c, 1);
    }
    printf("0");
    return;
    }
    void init(int n, int m)
    {

    for(int i = 1; i <= n; i++)
    scanf("%d", &data[i]);
    built(1, n, 1);
    }
    int main()
    {
    // freopen("in.txt","r", stdin);
    scanf("%d %d", &n, &m);
    init(n, m);
    solve(n, m);
    return 0;
    }

  • 1