이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*
"care a facut teste cu Lattice reduction attack e ciudat"
"linistiti va putin"
- 2023 -
*/
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long
using namespace std;
struct query
{
int type;
int l;
int r;
int k;
int c;
int a;
int b;
int time;
int ans;
};
int q;
vector<query> add[250001];
vector<query> rem[250001];
vector<query> answer[250001];
query qq[250001];
struct Node
{
int minval;
int lazy;
};
Node aint[1000001];
void prop(int val)
{
if (aint[val].lazy==0)
return;
aint[val].minval+=aint[val].lazy;
if (val*2+1<1000001)
{
aint[val*2].lazy+=aint[val].lazy;
aint[val*2+1].lazy+=aint[val].lazy;
}
aint[val].lazy=0;
}
void lazy_update(int l, int r, int val, int qa, int qb, int x)
{
prop(val);
if (qa<=l && r<=qb)
{
aint[val].lazy+=x;
return;
}
int mid;
mid=(l+r)/2;
if (qa<=mid)
lazy_update(l,mid,val*2,qa,qb,x);
if (qb>mid)
lazy_update(mid+1,r,val*2+1,qa,qb,x);
prop(val*2);
prop(val*2+1);
aint[val].minval=min(aint[val*2].minval,aint[val*2+1].minval);
}
int aint_query(int l, int r, int val, int qa, int qb)
{
prop(val);
if (qa<=l && r<=qb)
{
return aint[val].minval;
}
int mid,ans;
mid=(l+r)/2;
ans=1e18;
if (qa<=mid)
ans=min(ans,aint_query(l,mid,val*2,qa,qb));
if (qb>mid)
ans=min(ans,aint_query(mid+1,r,val*2+1,qa,qb));
return ans;
}
int aib[250001];
void aib_update(int index, int delta)
{
while (index<=q)
{
aib[index]+=delta;
index+=index&(-index);
}
}
int aib_query(int index)
{
int ans=0;
while (index>0)
{
ans+=aib[index];
index-=index&(-index);
}
return ans;
}
int kth(int k)
{
int r,pas;
r=0;
pas=(1<<18);
while (pas)
{
if (r+pas<=q && aib_query(r+pas)<k)
r+=pas;
pas=pas/2;
}
return r+1;
}
signed main()
{
ifstream fin("secvp.in");
ofstream fout("secvp.out");
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,i,j,actually_left,actualb;
cin >> n >> m >> q;
for (i=1;i<=q;i++)
{
cin >> qq[i].type;
qq[i].time=i;
if (qq[i].type==1)
{
cin >> qq[i].l >> qq[i].r >> qq[i].c >> qq[i].k;
add[qq[i].l].push_back(qq[i]);
rem[qq[i].r+1].push_back(qq[i]);
}
else if (qq[i].type==2)
{
cin >> qq[i].l >> qq[i].r >> qq[i].k;
add[qq[i].l].push_back(qq[i]);
rem[qq[i].r+1].push_back(qq[i]);
}
else if (qq[i].type==3)
{
cin >> qq[i].a >> qq[i].b;
answer[qq[i].a].push_back(qq[i]);
}
}
for (i=1;i<=n;i++)
{
for (auto x : rem[i])
{
if (x.type==1)
{
aib_update(x.time,-x.k);
lazy_update(1,q,1,x.time,q,-x.k);
}
else
{
lazy_update(1,q,1,x.time,q,x.k);
}
}
for (auto x : add[i])
{
if (x.type==1)
{
aib_update(x.time,x.k);
lazy_update(1,q,1,x.time,q,x.k);
}
else
{
lazy_update(1,q,1,x.time,q,-x.k);
}
}
for (auto x : answer[i])
{
actually_left=aib_query(x.time)-(aint_query(1,q,1,x.time,x.time)-min(1LL*0,aint_query(1,q,1,1,x.time)));
actualb=x.b+actually_left;
if (kth(actualb)<=x.time)
qq[x.time].ans=qq[kth(actualb)].c;
else
qq[x.time].ans=0;
}
}
for (i=1;i<=q;i++)
{
if (qq[i].type==3)
{
cout << qq[i].ans << "\n";
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
foodcourt.cpp: In function 'int main()':
foodcourt.cpp:131:15: warning: unused variable 'j' [-Wunused-variable]
131 | int n,m,i,j,actually_left,actualb;
| ^
# | 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... |