Cod sursa(job #3316998)

Utilizator clarageorgitaClara Georgita clarageorgita Data 21 octombrie 2025 17:20:53
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb


#include <iostream>
#include<fstream>
using namespace std;
ifstream in("cautbin.in");
ofstream out("cautbin.out");

int v1[100001], v2[100001];

int main()
{
	int n, ant, poz=1,x;
	in>>n;
	in>>ant;
	v1[poz]=ant;
	v2[poz]=1;
	for(int i=2; i<=n; i++) {
		in>>x;
		if(ant==x) ///adaug in v2 (cresc grupa de nr egale)
			v2[poz]++;
		else ///adaug in v1, incep o noua grupa de nr egale
		{
			poz++;
			v1[poz]=x;
			v2[poz]=1;
		}
		ant=x;
	}
	// for(int i=1;i<=poz;i++)
	//     cout<<v1[i]<<" ";
	// cout<<'\n';
	for(int i=1;i<=poz;i++)
	{
	    v2[i]=v2[i]+v2[i-1];
	   // cout<<v2[i]<<" ";
	}

	long long m, nr, y, st, dr, mij, aux=-1;
	in>>m;
	for(int i=1; i<=m; i++) {
		in>>nr>>y;
		if(nr==0) {
			st=1;
			dr=poz;
			aux=-1;
			while(st<=dr) {
				mij=st + (dr-st)/2;
				if(v1[mij]==y)
				{	aux=mij;
				    break;}
				if(v1[mij]<y)
					st=mij+1;
				else if(v1[mij]>y)
					dr=mij-1;
			}
			if(aux!=-1)
				out<<v2[aux]<<'\n';
			else
				out<<aux<<'\n';
		}else if(nr==1){
            st=1;
			dr=poz;
			aux=-1;
			while(st<=dr) {
				mij=st + (dr-st)/2;
				if(v1[mij]==y){
					aux=mij;
					break;}
				if(v1[mij]<y)
					st=mij+1;
				else if(v1[mij]>y)
					dr=mij-1;
			}
			if(aux!=-1)
			    out<<v2[aux]<<'\n';
			else
			    out<<v2[dr]<<'\n';
			    
        }else if(nr==2){
            st=1;
			dr=poz;
			aux=-1;
			while(st<=dr) {
				mij=st + (dr-st)/2;
				if(v1[mij]==y){
					aux=mij;
					break;}
				if(v1[mij]<y)
					st=mij+1;
				else if(v1[mij]>y)
					dr=mij-1;
			}
			if(aux!=-1)
			    out<<v2[aux-1]+1<<'\n';
			else
			    out<<v2[st-1]+1<<'\n';
        }

	}

	return 0;
}