이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<ll, ll>
#define f first
#define s second
#define REP(i,n) for(int i = 0; i<n; ++i)
#define pb push_back
#define SZ(x) (int)((x).size())
#ifdef BALBIT
#define bug(...) cerr<<"#"<<__LINE__<<"- "<<#__VA_ARGS__<<": ", _do(__VA_ARGS__)
template<typename T> void _do(T &&x) {cerr<<x<<endl;}
template<typename T, typename ...S> void _do(T &&x, S&& ...y) {cerr<<x<<", "; _do(y...);}
#else
#define bug(...)
#define endl '\n'
#endif
const int N = 250000;
const ll inf = 3e18;
ll bs[N];
void mo(int e, ll v) {
for(++e; e<N; e+=e&-e) bs[e] += v;
}
ll qu(int e) {
ll re = 0;
for(++e; e>0; e-=e&-e) re += bs[e];
return re;
}
ll s[N*4], mn[N*4], tg[N*4];
ll who[N]; // which group is added at this time
void push(int o, int l, int r) {
if(tg[o]) {
s[o] += tg[o];
mn[o] += tg[o];
if(l!=r) {
tg[o*2] += tg[o];
tg[o*2+1] += tg[o];
}
tg[o] = 0;
}
}
ll QU(int L, int R, int o=1, int l=0, int r=N-1) {
if(l > R || r<L) return inf;
push(o,l,r);
if(l>=L && r <=R) {
return mn[o];
}
int mid = (l+r)/2;
return min(
QU(L,R,o*2,l,mid),
QU(L,R,o*2+1,mid+1,r)
);
}
ll GET(int p, int o=1, int l=0, int r=N-1) {
if (l > p || r < p) return -1;
push(o,l,r);
if(l==r) return s[o];
int mid = (l+r)/2;
return p<=mid?GET(p,o*2,l,mid) : GET(p,o*2+1,mid+1,r);
}
void MO(int L, int R, ll v, int o=1, int l=0, int r = N-1) {
push(o,l,r);
if(l > R ||r < L) return;
if(l>=L && r <=R) {
tg[o] += v;
push(o,l,r);
return;
}
int mid = l+r>>1;
MO(L,R,v,o*2,l,mid);
MO(L,R,v,o*2+1,mid+1,r);
s[o] = s[o*2]+s[o*2+1];
mn[o] = min(mn[o*2], mn[o*2+1]);
}
vector<pii>ev[N]; // {position, value}
vector<pii>ev2[N]; // {position, value}
vector<pii> que[N]; // {position, number};
ll ans[N];
signed main() {
ios::sync_with_stdio(0), cin.tie(0);
int n,m,q; cin>>n>>m>>q;
memset(ans, -1, sizeof ans);
REP(i,q) {
int tp ;cin>>tp;
if(tp == 1) {
ll l,r,c,k; cin>>l>>r>>c>>k;
who[i] = c;// group set
ev[l].pb({i,k});
ev[r+1].pb({i,-k});
}else if (tp == 2) {
ll l,r,k; cin>>l>>r>>k;
ev2[l].pb({i,-k});
ev2[r+1].pb({i,+k});
}else if (tp == 3) {
ll a,b; cin>>a>>b;
que[a].pb({i, b});
}
}
for(int i=1; i<=n; ++i) {
// bug("position ", i);
for(pii p : ev[i]) {
int at = p.f;
ll val = p.s;
MO(at, N-1, val);
bug(at, val);
mo(at, val);
}
for(pii p : ev2[i]) {
int at = p.f;
ll val = p.s;
MO(at, N-1, val);
bug(at, val);
}
for(pii p : que[i]) {
int at = p.f;
ll num = p.s;
ll low = min(0ll,QU(0, at));
ll val = GET(at);
bug(val, low);
if (val - low >= num) {
// continue here
bug(num, val-low-num);
num = val - low + 1 - num;
int l = 0, r = at;
while (l!=r) {
int mid = (l+r)/2;
if (qu(at) - qu(mid-1) >= num) {
l = mid+1;
}else{
r = mid;
}
}
--l;
bug(l);
ans[at] = who[l];
}else{
ans[at] = 0;
}
}
}
REP(i, q) {
if (ans[i] != -1) cout<<ans[i]<<endl;
}
}
컴파일 시 표준 에러 (stderr) 메시지
foodcourt.cpp: In function 'void MO(int, int, long long int, int, int, int)':
foodcourt.cpp:80:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
80 | int mid = l+r>>1;
| ~^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |