Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define pb emplace_back
- using namespace std;
- using ll = long long;
- const int maxn = 100010;
- int x[maxn], y[maxn], L, n;
- ll res;
- void upsd() {
- for (int i = 0;i < n;++i)
- x[i] = L - x[i] - 1;
- }
- struct sgt {
- int mn[maxn<<1], sec[maxn<<1], tag[maxn<<1];
- ll sum[maxn<<1], mncnt[maxn<<1];
- void push(int i) {
- if (i < n && tag[i]) {
- node_chmx(i<<1, tag[i]);
- node_chmx(i<<1|1, tag[i]);
- tag[i] = 0;
- }
- }
- void node_chmx(int i, int val) {
- if (i > n+n || mn[i] >= val) return;
- if (val < sec[i]) {
- sum[i] += mncnt[i] * (val - mn[i]);
- mn[i] = val;
- tag[i] = val;
- return;
- }
- tag[i] = max(tag[i], val);
- push(i);
- update(i);
- }
- void update(int i) {
- if (i >= n) return;
- push(i);
- sum[i] = sum[i<<1] + sum[i<<1|1];
- mn[i] = min(mn[i<<1], mn[i<<1|1]), sec[i] = INT_MAX;
- mncnt[i] = (mn[i] == mn[i<<1] ? mncnt[i<<1] : 0) + (mn[i] == mn[i<<1|1] ? mncnt[i<<1|1] : 0);
- for (int v : {mn[i], mn[i<<1|1], sec[i], sec[i<<1|1]})
- if (v > mn[i]) sec[i] = min(sec[i], v);
- if (sec[i] == INT_MAX) sec[i] = mn[i];
- }
- void init() {
- for (int i = 0;i < n;++i) {
- sum[i+n] = mn[i+n] = sec[i+n] = i;
- mncnt[i+n] = 1;
- }
- for (int i = n-1;i > 0;--i)
- update(i);
- }
- void pa(int v) {
- for (int i = 18;i > 0;--i)
- push(v>>i);
- }
- ll getsum(int l, int r) {
- l += n, r += n;
- pa(l), pa(r);
- ll res = 0;
- for (;l < r;l>>=1, r>>=1) {
- if (l&1) res += sum[l++];
- if (r&1) res += sum[--r];
- }
- return res;
- }
- void modify(int i, int v) {
- i += n;
- pa(i);
- sum[i] = mn[i] = sec[i] = v;
- mncnt[i] = 1;
- for (;i>>=1;)
- update(i);
- }
- void chmx(int l, int r, int v) {
- l += n, r += n;
- int sl = l>>1, sr = r>>1;
- for (;l < r;l>>=1, r>>=1) {
- if (l&1) node_chmx(l++, v);
- if (r&1) node_chmx(--r, v);
- }
- for (;sl;sl>>=1, sr>>=1)
- update(sl), update(sr);
- }
- }tree;
- void solve() {
- vector<vector<int>> mp(L);
- vector<int> vis(L);
- for (int i = 0;i < n;++i)
- mp[x[i]].pb(y[i]);
- ll sum = (n-1) * n / 2;
- ll old = res;
- tree.init();
- cerr << "GS 0 " << tree.getsum(0, n) << '\n';
- cerr << "Sum " << sum << '\n';
- for (int i = 0;i < L;++i, res += sum) {
- for (int u : mp[i]) {
- tree.chmx(u+1, n, u-1);
- tree.modify(u, -1);
- }
- cerr << "getsum at " << i << ' ' << tree.getsum(0, n) << '\n';
- res += sum - tree.getsum(0, n);
- cerr << "Add " << sum - tree.getsum(0, n) << '\n';
- }
- cerr << res -old<< '\n';
- exit(0);
- for (int i = 0;i < L;++i) {
- auto &v = mp[i];
- if (v.size()) res -= L - v.size();//, cerr << " - " << n-v.size() << '\n';
- }
- res -= n;
- }
- signed main(){
- ios_base::sync_with_stdio(0), cin.tie(0);
- cin >> L >> n;;
- for (int i = 0;i < n;++i)
- cin >> x[i] >> y[i];
- solve();
- upsd();
- solve();
- for (int i = 0;i < n;++i)
- y[i] = L - y[i] - 1;
- solve();
- upsd();
- solve();
- cout << res << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement