제출 #1365341

#제출 시각아이디문제언어결과실행 시간메모리
1365341thaibaotran555새로운 문제 (POI11_met)C++20
100 / 100
915 ms30692 KiB
///TRAN THAI BAO :3

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

#define maxN 300007

int n, m, q;
int pt[maxN];
vector<int>land[maxN];
int ans[maxN];

struct BIT
{
    long long b[maxN];
    void reset()
    {
        memset(b, 0, sizeof(b));
    }
    void update(int pos, int val)
    {
        for(; pos <= m; pos += (pos & -pos))
            b[pos] += val;
    }
    long long get(int pos)
    {
        long long ans = 0;
        for(; pos > 0; pos -= (pos & -pos))
            ans += b[pos];
        return ans;
    }
    void updateRange(int l, int r, long long val)
    {
        if(l <= r)
        {
            update(l, val);
            update(r+1, -val);
        }
        else
        {
            update(1, val);
            update(r+1, -val);
            update(l, val);
        }
    }
};

struct add
{
    int l, r;
    long long val;
};

struct CURQUERY
{
    int lo, hi;
    int id;
};

bool CMPQUERY(CURQUERY one, CURQUERY two)
{
    int midOne = (one.lo + one.hi)/2;
    int midTwo = (two.lo + two.hi)/2;
    if(midOne != midTwo)
        return midOne < midTwo;
    return one.id < two.id;
}

vector<CURQUERY> curQ;

BIT bit;

add op[maxN];

void compute()
{
    bit.reset();
    vector<CURQUERY>nxt;
    sort(curQ.begin(), curQ.end(), CMPQUERY);
    int j = 1;
    for(int i = 0; i < curQ.size(); i++)
    {
        CURQUERY cur = curQ[i];
        int curT = (cur.lo + cur.hi)/2;
        while(j <= curT)
        {
            bit.updateRange(op[j].l, op[j].r, op[j].val);
            j++;
        }
        long long tmp = 0;
        for(int i2 = 0; i2 < land[cur.id].size(); i2++)
        {
            tmp += bit.get(land[cur.id][i2]);
            if(tmp >= (long long)pt[cur.id])
                break;
        }
        if(tmp >= (long long)pt[cur.id])
        {
            ans[cur.id] = min(ans[cur.id], curT);
            cur.hi = curT-1;
        }
        else cur.lo = curT+1;
        if(cur.lo <= cur.hi)
            nxt.push_back(cur);
    }
    curQ.clear();
    swap(nxt, curQ);
}

void readData()
{
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int tmp;
        cin >> tmp;
        land[tmp].push_back(i);
    }
    for(int i = 1; i <= n; i++)
        cin >> pt[i];
    cin >> q;
    for(int i = 1; i <= n; i++)
    {
        ans[i] = q+1;
        curQ.push_back({1, q, i});
    }
    for(int i = 1; i <= q; i++)
        cin >> op[i].l >> op[i].r >> op[i].val;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    readData();
    while(!curQ.empty()) compute();
    for(int i = 1; i <= n; i++)
        if(ans[i] == q+1)
            cout << "NIE\n";
        else cout << ans[i] << "\n";
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…