This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define pb push_back
#define lwb lower_bound
#define upb upper_bound
#define TASKNAME "NAME"
void init()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
///freopen(TASKNAME".INP","r",stdin); freopen(TASKNAME".OUT","w",stdout);
}
const int SZ = 1e5+5;
const ll INF = INT_MAX / 2, MOD = 1e9+7, INFLL = 2e18;
const double epsilon = 1e-3;
int a,b,n;
struct SegTree
{
set<int> nodes[4*SZ];
void update(int id, int lo, int hi, int u, int v, int val)
{
if(hi < u || lo > v) return;
if(lo >= u && hi <= v)
{
nodes[id].insert(val);
//cout << "update " << lo << " " << hi << " " << val << '\n';
return;
}
int mid = (lo + hi) / 2;
update(2*id, lo, mid, u , v, val);
update(2*id+1, mid+1, hi, u, v, val);
}
pii query(int id, int lo, int hi, int x, int y)
{
pii res;
auto it1 = nodes[id].lower_bound(y);
if(it1 == nodes[id].begin())
{
res = { (it1 == nodes[id].end() ? INF : *it1), -INF};
} else
{
auto it2 = it1;
it2--;
res = { (it1 == nodes[id].end() ? INF : *it1) , *it2};
}
//cout << "query " << lo << " " << hi << " " << res.fi << " " << res.se << '\n';
if(lo == hi) return res;
int mid = (lo + hi) / 2;
pii cur;
if(x <= mid) cur = query(2*id, lo, mid, x, y);
else cur = query(2*id+1, mid+1, hi, x, y);
return {min(res.fi, cur.fi), max(res.se, cur.se) };
}
};
SegTree seg1, seg2;
int main()
{
init();
cin >> a >> b;
seg1.update(1, 1, a, 1, a, 0);
seg1.update(1, 1 ,a, 1, a, b);
seg2.update(1, 1, b, 1, b, 0);
seg2.update(1, 1, b, 1, b, a);
cin >> n;
//n = 1;
for(int i = 1; i <= n; i++)
{
int x,y,d;
cin >> x >> y >> d;
pii cur1 = seg1.query(1, 1, a, x, y);
pii cur2 = seg2.query(1, 1, b, y, x);
ll a1 = cur1.fi - cur1.se, a2 = cur2.fi - cur2.se;
//cout << cur1.fi << " " << cur1.se << " - " << cur2.fi << " " << cur2.se << '\n';
if(d == 1)
{
ll res1 = a2 * (cur1.fi - y), res2 = a2 * (y - cur1.se);
cout << min(res1, res2) << " " << max(res1, res2) << '\n';
seg1.update(1, 1, a, cur2.se, cur2.fi, y);
} else
{
ll res1 = a1 * (cur2.fi - x), res2 = a1 * (x - cur2.se);
cout << min(res1, res2) << " " << max(res1, res2) << '\n';
seg2.update(1, 1, b, cur1.se, cur1.fi, x);
}
}
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |