Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. #include<iostream>
  2. #include<map>
  3. #include<vector>
  4. using namespace std;
  5. int a[100000];
  6. int n;
  7. int first[100000],nxt[100000];
  8. vector<int> vec[1000000];
  9. void PRE()
  10. {
  11. for(int i=1;i<=n;i++)
  12. {
  13. if(first[a[i]]==0)
  14. first[a[i]]=i;
  15. vec[a[i]].push_back(i);
  16. }
  17. }
  18. int val[1000000];
  19.  
  20. int query(int x,int y)
  21. {
  22. int ret=0;
  23. int N=vec[x].size();
  24. int M=vec[y].size();
  25. int V=50000,tot=N+M;
  26. int l=V-tot-1;
  27. int r=V+tot+1;
  28. for (int i=l;i<=r;i++)
  29. val[i]=0;
  30. val[V]=1;
  31. int cur=V,i=0,j=0;
  32. int st=1;
  33. while(1)
  34. {
  35.  
  36. if (i<N && j<M)
  37. {
  38. int p1=vec[x][i];
  39. int p2=vec[y][j];
  40. int num=min(p1,p2)-st;
  41. if(num)ret+=(num)*(num-1)/2;
  42. ret+=val[cur]*num;
  43. val[cur]+=num;
  44. st=min(p1,p2);
  45. if(p1<p2)cur--,i++;
  46. else cur++,j++;
  47. }
  48. else if(i<N){
  49. int p=vec[x][i];
  50. int num=p-st;
  51. if(num)ret+=(num)*(num-1)/2;
  52. ret+=val[cur]*num;
  53. val[cur]+=num;
  54. st=p,i++;
  55. cur--;
  56. }
  57. else if(j<M){
  58. int p=vec[y][j];
  59. int num=p-st;
  60. if(num)ret+=(num)*(num-1)/2;
  61. ret+=val[cur]*num;
  62. val[cur]+=num;
  63. st=p,j++;
  64. cur++;
  65. }
  66. else{
  67. int num=n+1-st;
  68. if(num)ret+=(num)*(num-1)/2;
  69. ret+=val[cur]*num;
  70. break;
  71. }
  72.  
  73. }
  74. return ret;
  75. }
  76. map<int,int> to;
  77. int num=1;
  78. int main()
  79. {
  80. int q;
  81. cin>>n>>q;
  82. for (int i=1;i<=n;i++)
  83. {
  84. cin>>a[i];
  85. if (to[a[i]]==0)
  86. to[a[i]]=num++;
  87. a[i]=to[a[i]];
  88. }
  89. PRE();
  90. for (int i=0;i<q;i++)
  91. {
  92. int x,y;
  93. cin>>x>>y;
  94. x=to[x],y=to[y];
  95. cout<<query(x,y)<<endl;
  96. }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement