#include #include #include #include #include #include #include #include #include #include #include #define cl(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; typedef double db; const db pi=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862; void gn(int &x){ int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c=='-')sg=-1,x=0;else x=c-'0'; while((c=getchar())>='0'&&c<='9')x=x*10+c-'0'; x*=sg; } void gn(ll &x){ int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c=='-')sg=-1,x=0;else x=c-'0'; while((c=getchar())>='0'&&c<='9')x=x*10+c-'0'; x*=sg; } int mo=1000000007; int inf=1000000000; db eps=1e-6; //ll inf=1000000000000000000ll; int qp(int a,ll b){int ans=1;do{if(b&1)ans=1ll*ans*a%mo;a=1ll*a*a%mo;}while(b>>=1);return ans;} int gcd(int a,int b){return b?gcd(b,a%b):a;} int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; #define x1 x192837465 #define x2 x123456789 #define y1 y192837465 #define y2 y123456789 struct node{int ch[2],pre,mi,fl,up,v;}t[40005]; void fl(int x){swap(t[x].ch[0],t[x].ch[1]);t[x].fl^=1;} void pd(int x){if(t[x].fl)fl(t[x].ch[0]),fl(t[x].ch[1]),t[x].fl=0;} void pu(int x){t[x].mi=min(t[x].v,min(t[t[x].ch[0]].mi,t[t[x].ch[1]].mi));} void rot(int x){ int y=t[x].pre;pd(y);pd(x); int f=t[y].ch[0]==x;t[x].up=t[y].up; t[y].ch[!f]=t[x].ch[f];t[t[x].ch[f]].pre=y; t[x].pre=t[y].pre;t[t[y].pre].ch[t[t[y].pre].ch[1]==y]=x; t[x].ch[f]=y;t[y].pre=x; pu(y); } void spl(int x){ if(!t[x].pre)pd(x); else{ while(t[x].pre)rot(x); pu(x); } } int acc(int x){ int y=0; for(;x;y=x,x=t[x].up){ spl(x); t[t[x].ch[1]].up=x; t[t[x].ch[1]].pre=0; t[x].ch[1]=y; t[y].pre=x; pu(x); } return y; } int gr(int x){ acc(x);spl(x); while(t[x].ch[0])x=t[x].ch[0],pd(x); return x; } void mr(int x){ acc(x);spl(x);fl(x); } void lk(int x,int y){ mr(x);t[x].up=y; } void cut(int x,int y){ mr(x);acc(y);spl(x); t[y].pre=t[y].up=0; t[x].ch[1]=0;pu(x); } int quemi(int x,int y){ mr(x);acc(y);spl(y);return t[y].mi; } int n,m; int f[50005]; int x[50005],y[50005]; struct segnode{int l,r,x;}tt[4000005];int ndtot=0; int head[50005]={0}; void clear(){ memset(t,0,sizeof(t)); for (int i=0;i<=ndtot;i++)tt[i].l=tt[i].r=tt[i].x=0; ndtot=0; cl(f); cl(x); cl(y); cl(head); } int add(int x,int v,int l,int r){ int y=++ndtot; tt[y]=tt[x]; tt[y].x++; if(l!=r){ int mid=l+r>>1; if(v<=mid)tt[y].l=add(tt[x].l,v,l,mid); else tt[y].r=add(tt[x].r,v,mid+1,r); } return y; } int lim; int Que(int h1,int h2){ int l=0,r=m+1,su=0; while(1){ if(lim>r)break; if(l==r && l==lim){su+=tt[h2].x-tt[h1].x;break;} int mid=l+r>>1; if(mid+1>=lim){ su+=tt[tt[h2].r].x-tt[tt[h1].r].x; h2=tt[h2].l,h1=tt[h1].l;r=mid; }else{ h2=tt[h2].r,h1=tt[h1].r;l=mid+1; } } return su; } struct ee{ int u,v,w; }ed[33333]; void build() { t[0].mi=inf; for (int i=1;i<=n;i++)t[i].v=t[i].mi=inf; for (int i=1;i<=m;i++){ x[i]=ed[i].u; y[i]=ed[i].v; if(x[i]==y[i])f[i]=m+1; else{ if(gr(x[i])!=gr(y[i]))f[i]=0; else{ int mi=quemi(x[i],y[i]); f[i]=mi; cut(mi+n,x[mi]); cut(mi+n,y[mi]); } t[i+n].v=t[i+n].mi=i; lk(i+n,x[i]); lk(i+n,y[i]); } } for (int i=1;i<=m;i++)head[i]=add(head[i-1],f[i],0,m+1); } int ask(int l,int r){ if(l>r)return n; lim=l; return n-(r-l+1)+Que(head[l-1],head[r]); } int cmpe(const ee&a,const ee&b){ return a.w1){ printf("-1\n"); }else{ int mi=2147000000; for (int r=1,l=1;r<=m;r++){ while(l