Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- #include<stdio.h>
- #include<cstdio>
- #include<stdlib.h>
- #include<string>
- #include<string.h>
- #include<ctype.h>
- #include<algorithm>
- #include<cmath>
- #include<set>
- #include<queue>
- #include<assert.h>
- #include<stack>
- #include<iomanip>
- #include<vector>
- #include<map>
- #define PB(x) push_back(x)
- #define MP(x, y) make_pair(x, y)
- #define fi first
- #define se second
- #define ll long long
- #define pii pair< int, int >
- #define MEM(p, v) memset(p, v, sizeof(p))
- #define READ(f) freopen(f, "r", stdin)
- #define WRITE(f) freopen(f, "w", stdout)
- #define S system("pause")
- #define R return(0)
- #define INF int(1e9)
- #define MAX_5 int(1e5+5)
- #define MAX_6 int(1e6+6)
- #define ll long long
- #define tree int h,int l1,int r1
- #define left 2*h,l1,(l1+r1)/2
- #define right 2*h+1,(l1+r1)/2+1,r1
- #define M int(1e9)
- using namespace std;
- #define ull unsigned long long
- #define N int (1e5+5)
- ll p[N],siz[N],qve[N],n,ans,w,SUM;
- vector<int>v[N];
- set<int>st[N];
- pair<pii,int>a[N];
- int pp(int a)
- {
- return ((p[a]==a)?a:(p[a]=pp(p[a])));
- }
- void un(int a,int b)
- {
- int A=pp(a);
- int B=pp(b);
- siz[A]+=siz[B];
- siz[B]=0;
- p[B]=A;
- }
- int check(int x,int y)
- {
- int l=1,r=n,mid,ls=-1;
- while(l<=r)
- {
- mid=l+r;mid/=2;
- if(a[mid].fi.fi==x && a[mid].fi.se==y)ls=a[mid].se;
- if(
- a[mid].fi.fi<x
- ||
- (a[mid].fi.fi==x && a[mid].fi.se<y)
- )
- l=mid+1;else r=mid-1;
- }
- w=ls;
- if(ls==-1)return 0;else return 1;
- }
- int edge(int x,int y)
- {
- return(st[x].count(y));
- }
- void add(int x,int y)
- {
- st[x].insert(y);
- st[y].insert(x);
- v[x].push_back(y);
- v[y].push_back(x);
- }
- void build(int x,int p=-1)
- {
- qve[x]=siz[x];
- for(int i=0;i<v[x].size();i++)
- if(v[x][i]!=p)
- build(v[x][i],x),
- qve[x]+=qve[v[x][i]];
- }
- void go(int x,int p=-1)
- {
- ans+=(1LL*qve[x]*(SUM-qve[x]))%M;
- for(int i=0;i<v[x].size();i++)
- if(v[x][i]!=p)
- go(v[x][i],x);
- }
- void aloha()
- {
- sort(a+1,a+n+1);
- for(int i=1;i<=n;i++)p[i]=i,siz[i]=1;
- for(int i=2;i<=n;i++)
- if(a[i].fi.fi==a[i-1].fi.fi && a[i].fi.se-1==a[i-1].fi.se)
- un(a[i-1].se,a[i].se);
- for(int i=1;i<=n;i++)
- {
- if(check(a[i].fi.fi+1,a[i].fi.se))
- if(!edge(pp(a[i].se),pp(w)))
- add(pp(a[i].se),pp(w));
- }
- SUM=0;
- for(int i=1;i<=n;i++)SUM+=siz[i];
- build(pp(1));
- go(pp(1));
- }
- int main(){
- cin>>n;
- for(int i=1;i<=n;i++)cin>>a[i].fi.fi>>a[i].fi.se,a[i].se=i;
- aloha();
- for(int i=1;i<=n;i++)swap(a[i].fi.fi,a[i].fi.se);
- for(int i=1;i<=n;i++)
- v[i].clear(),
- st[i].clear();
- aloha();
- cout<<ans%M<<endl;
- cin>>n;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement