Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<map>
- #include<vector>
- using namespace std;
- int a[100000];
- int n;
- int first[100000],nxt[100000];
- vector<int> vec[1000000];
- void PRE()
- {
- for(int i=1;i<=n;i++)
- {
- if(first[a[i]]==0)
- first[a[i]]=i;
- vec[a[i]].push_back(i);
- }
- }
- int val[1000000];
- int query(int x,int y)
- {
- int ret=0;
- int N=vec[x].size();
- int M=vec[y].size();
- int V=50000,tot=N+M;
- int l=V-tot-1;
- int r=V+tot+1;
- for (int i=l;i<=r;i++)
- val[i]=0;
- val[V]=1;
- int cur=V,i=0,j=0;
- int st=1;
- while(1)
- {
- if (i<N && j<M)
- {
- int p1=vec[x][i];
- int p2=vec[y][j];
- int num=min(p1,p2)-st;
- if(num)ret+=(num)*(num-1)/2;
- ret+=val[cur]*num;
- val[cur]+=num;
- st=min(p1,p2);
- if(p1<p2)cur--,i++;
- else cur++,j++;
- }
- else if(i<N){
- int p=vec[x][i];
- int num=p-st;
- if(num)ret+=(num)*(num-1)/2;
- ret+=val[cur]*num;
- val[cur]+=num;
- st=p,i++;
- cur--;
- }
- else if(j<M){
- int p=vec[y][j];
- int num=p-st;
- if(num)ret+=(num)*(num-1)/2;
- ret+=val[cur]*num;
- val[cur]+=num;
- st=p,j++;
- cur++;
- }
- else{
- int num=n+1-st;
- if(num)ret+=(num)*(num-1)/2;
- ret+=val[cur]*num;
- break;
- }
- }
- return ret;
- }
- map<int,int> to;
- int num=1;
- int main()
- {
- int q;
- cin>>n>>q;
- for (int i=1;i<=n;i++)
- {
- cin>>a[i];
- if (to[a[i]]==0)
- to[a[i]]=num++;
- a[i]=to[a[i]];
- }
- PRE();
- for (int i=0;i<q;i++)
- {
- int x,y;
- cin>>x>>y;
- x=to[x],y=to[y];
- cout<<query(x,y)<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement