제출 #1148368

#제출 시각아이디문제언어결과실행 시간메모리
1148368arkanefuryNautilus (BOI19_nautilus)C++20
0 / 100
4 ms7488 KiB
#include <bits/stdc++.h>  
#define pb push_back  
using namespace std;  
#define F first  
#define sz size()  
#define S second  
#define in insert
#define all(v) v.begin(), v.end()  
#define FOR(x, n, m, d) for(int x = n; x <= m; x += d)  
#define FORR(x, n, m, d) for(int x = n; x >= m; x -= d)  
#define nikita ios_base::sync_with_stdio(0), cin.tie(0);  
const int N = 3e5+150;  
int n,m,k,tt,ans,l, r, x, y, cnt; 
int b[N],a[N], sum, root[N];
vector<int>v[N];
map<int, int>s, le, ri;
int siz = 1;
int upd(int v, int l, int r, int val, int tl = 1, int tr = m){
    int nv = ++siz;
    s[nv] = s[v], le[nv] = le[v], ri[nv] = ri[v];
    if(l <= tl && tr <= r){
        s[nv] += val;
        return nv;
    }
    if(l > tr || tl > r)return v;
    int tm = (tl + tr) >> 1;
    le[nv] = upd(le[nv], l, r, val, tl, tm);
    ri[nv] = upd(ri[nv], l, r, val, tm+1, tr);
    return nv;
}
void get(int v, int pos, int tl = 1, int tr = m){
        ans += s[v];
        ans = min(ans, (int)1e9);
    if(tl == tr){
        return;
    }
    int tm = (tl + tr) >> 1;
    if( pos <= tm )get(le[v], pos, tl, tm);
    else get(ri[v], pos, tm+1, tr);
}
void solve(){
    nikita
    cin >> n >> m;
    FOR(i, 1, m, 1){
        cin >> a[i];
        v[a[i]].pb(i);
    }
    FOR(i, 1, n, 1)cin >> b[i];
    cin >> k;
    FOR(i, 1, k, 1){
        cin >> x >> y >> cnt;
        if(x <= y){
            root[i] = upd(root[i-1], x, y, cnt);
        }
        else{
            root[i] = upd(root[i-1], x, m, cnt);
            root[i] = upd(root[i], 1, y, cnt);
        }
    }
    FOR(i, 1, n, 1){
            l = 1, r = k;
            int lp = 0;
            while(l <= r){
                int md = (l + r) >> 1;
                ans = 0;
        for(auto j : v[i]){
                get(root[md], j);
            }
            if(ans < b[i])l = md + 1, lp = md;
            else r = md - 1;
        }
        if(l == k + 1)cout << "NIE\n";
        else cout << lp + 1 << '\n';
    }
}
signed main()  
{  
    nikita  
    tt = 1;  
    if(!tt)cin >> tt;  
    FOR(i, 1, tt, 1){  
    solve();  
    }  
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...