Submission #1273449

#TimeUsernameProblemLanguageResultExecution timeMemory
1273449i271828Poklon (COCI17_poklon)C++20
140 / 140
4275 ms385252 KiB
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;

const int MAX=500005;

struct ST{
	int s,e,m;
	vector<int> A;
	ST *l,*r;
	ST(int s,int e,int* B){
		this->s=s;
		this->e=e;
		m=(s+e)>>1;
		if (s==e){
			A.push_back(B[s]);
			return;
		}
		l=new ST(s,m,B);
		r=new ST(m+1,e,B);
		A.resize(l->A.size()+r->A.size());
		merge(l->A.begin(),l->A.end(),r->A.begin(),r->A.end(),A.begin());
	}
	int qry(int x,int y,int a){
		if (x<=s&&y>=e){
			//cout<<A.end()-upper_bound(A.begin(),A.end(),a)<<'\n';
			return A.end()-upper_bound(A.begin(),A.end(),a);
		}
		if (y<s||x>e) return 0;
		return l->qry(x,y,a)+r->qry(x,y,a);
	}
};

int N,Q;
int A[MAX];
int B1[MAX],B2[MAX],B3[MAX];
map<int,int> m1;
map<int,int> m2;
map<int,int> m3;

int main(){
	ios::sync_with_stdio(false);cin.tie(NULL);
	cin>>N>>Q;
	for (int i=0;i<N;i++) cin>>A[i];
	for (int i=N-1;i>=0;i--){
		B1[i]=m1.find(A[i])==m1.end()?1<<30:m1[A[i]];
		B2[i]=m2.find(A[i])==m2.end()?1<<30:m2[A[i]];
		B3[i]=m3.find(A[i])==m3.end()?1<<30:m3[A[i]];
		if (m2.find(A[i])!=m2.end()) m3[A[i]]=m2[A[i]];
		if (m1.find(A[i])!=m1.end()) m2[A[i]]=m1[A[i]];
		m1[A[i]]=i;
	}
	auto st1=new ST(0,N-1,B1),st2=new ST(0,N-1,B2),st3=new ST(0,N-1,B3);
	while (Q--){
		int l,r;cin>>l>>r;l--,r--;
		cout<<2*st2->qry(l,r,r)-st1->qry(l,r,r)-st3->qry(l,r,r)<<'\n';
	}/**/
	
	/*
	for (int i=0;i<N;i++) cout<<B1[i]<<' ';cout<<'\n';
	for (int i=0;i<N;i++) cout<<B2[i]<<' ';cout<<'\n';
	for (int i=0;i<N;i++) cout<<B3[i]<<' ';cout<<'\n';
	*/
}
#Verdict Execution timeMemoryGrader output
Fetching results...