"use strict"
function Main(input){
  input=input.trim();
  input=input.split(/\s+/);
  input.map(x => x-0);
  var N=input.shift();
  var M=input.shift();
  var allCombination=N*(N-1)/2;
  var connected=[];
  var inversedResult=[0];//巻き戻しで最後からj番目までの橋を復元させたときの不便さの軽減
  outer: for(let j=0;j<M;j++){
    let B=input.pop();
    let A=input.pop();
    let whereIsA=-Infinity
    let whereIsB=-Infinity;
    inner: for(let i=0;i<connected.length;i++){//i番目のグループに島Aj、Bjがないか検索
      let hasA=(connected[i].indexOf(A)!==-1);
      let hasB=(connected[i].indexOf(B)!==-1);
      if(hasA&&hasB){//両方同じグループだったら不便さは軽減しない。次のouterループへ。
        inversedResult[j+1]=inversedResult[j];
        continue outer;
      }
      if((!hasA)&&hasB)whereIsB=i;
      if(hasA&&(!hasB))whereIsA=i;
      if(whereIsA>=0&&whereIsB>=0)break inner;//両方揃ったら検索は終了。
    }
    if(whereIsA>=0&&whereIsB>=0){
      let sizeA=connected[whereIsA].length;
      let sizeB=connected[whereIsB].length;
      connected[whereIsA]=connected[whereIsA].concat(connected[whereIsB]);
      connected.splice(whereIsB,1);
      inversedResult[j+1]=inversedResult[j]+sizeA*sizeB;
    }else if(whereIsA>=0){
      let sizeA=connected[whereIsA].length;
      connected[whereIsA].push(B);
      inversedResult[j+1]=inversedResult[j]+sizeA;
    }else if(whereIsB>=0){
      let sizeB=connected[whereIsB].length;
      connected[whereIsB].push(A);
      inversedResult[j+1]=inversedResult[j]+sizeB;
    }else{
      connected.push([A,B]);
      inversedResult[j+1]=inversedResult[j]+1;
    }    
  }//outerループ了
  var result=[];
  for(let i=0;i<M;i++){
    result[i]=allCombination-inversedResult[M-1-i];
  }
  result=result.join("\n");
  console.log(result);
}

Main(require("fs").readFileSync("/dev/stdin","utf8"));