#include #include using namespace std; using ll=long long; //Aをソート:sort(A.begin(),A.end()); /*二分探索で0以上n未満の中でm以上の最大のiを得る時、 A[n]の形で宣言した場合、lower_bound(A,A+n,m)-A; vector A(n)の形で宣言した場合、lower_bound(A.begin(),A.end(),m)-A.begin();*/ //char型は0~255までしか持つことができない //bitのor演算はx|yで表す //配列の要素数間違えない //priority_queueは大きい順に取るようになっている //priority_queue,greater> T;で小さい順に取るようにする //p[i]=make_pair(a,b)みたいな感じで代入 //2のi乗は(1<siz[root2]){ par[root2]=root1; siz[root1]+=siz[root2]; } else{ par[root1]=root2; siz[root2]+=siz[root1]; } } bool check(int u,int v){ if(root(u)==root(v)){ return true; } else{ return false; } } }; ll modpow(ll a,ll n,ll p){ if (n == 0){ return 1; // 0乗にも対応する場合 } if (n == 1){ return a % p; } if (n % 2 == 1){ return (a*modpow(a,n-1,p))%p; } ll t=modpow(a,n/2,p); return (t*t)%p; } struct Segsum{ //datは1indexed int dat[1000000],siz=1; void make(int n){ siz=1; while(siz=2){ pos/=2; dat[pos]=dat[2*pos]+dat[2*pos+1]; } } int query(int l, int r, int a, int b, int u){ if(r<=a || b<=l){ return 0; } if(l<=a && b<=r){ return dat[u]; } int m=(a+b)/2; int ansL=query(l,r,a,m,2*u); int ansR=query(l,r,m,b,2*u+1); return (ansL+ansR); } }; struct Segmax{ //datは1indexed int dat[1000000],siz=1; void make(int n){ siz=1; while(siz=2){ pos/=2; dat[pos]=max(dat[2*pos],dat[2*pos+1]); } } int query(int l, int r, int a, int b, int u){ if(r<=a || b<=l){ return -1e9; } if(l<=a && b<=r){ return dat[u]; } int m=(a+b)/2; int ansL=query(l,r,a,m,2*u); int ansR=query(l,r,m,b,2*u+1); return max(ansL,ansR); } }; int main(){ int n,m,k; cin>>n>>m>>k; int c[n],d[n]; for(int i=0; i>a>>b; c[a-1]++; d[b-1]++; } int memo=0; for(int i=0; i e; for(int i=0; i