Pagini recente » Cod sursa (job #1014446) | Rating Sugu Ecaterina (danyaly) | Cod sursa (job #1534872) | Cod sursa (job #3237079) | Cod sursa (job #659008)
Cod sursa(job #659008)
#include <stdio.h>
#define nmax 100010
#define BUF 100010
char buffer[BUF+4];
int poz=BUF-1;
FILE *fin;
void cit(int &n){
n=0;
poz++;
if(poz==BUF){
poz=0;
//citesc o noua linie
fread (buffer,sizeof(char),BUF,fin);
}
while(buffer[poz]>='0' && buffer[poz]<='9'){
n=n*10+(buffer[poz]-'0');
poz++;
if(poz==BUF){
poz=0;
//citesc o noua linie
fread (buffer,sizeof(char),BUF,fin);
}
}
}
int v[nmax];
int val;
int cauta0(int li, int ls){
//cea m mare poz pe care se afla un elem cu val x
if(li==ls){
if(v[li]==val)return li;
return -1;
}
if(li<ls){//am cel putin doua elemente
int mij=li+((ls-li)>>1);
if(v[mij]==val){
if(v[mij+1]>val)return mij;
return cauta0(mij+1,ls);
}
if(v[mij]>val) return cauta0(li,mij-1);//trebuie sa caut in prima jumatate
if(v[mij]<val) return cauta0(mij+1,ls);//trebuie sa caut in a doua jumatate
}
}
int cauta1(int li, int ls){
//cea mai mare poz care are un elem mai mic/egal ca val
if(li==ls){
if(v[li]<=val)return li;
return -1;
}
if(li<ls){//am cel putin doua elemente
int mij=li+((ls-li)>>1);
if(v[mij]<=val){
if(v[mij+1]>val)return mij;
return cauta1(mij+1,ls);
}
if(v[mij]>val) return cauta1(li,mij-1);//trebuie sa caut in prima jumatate
}
}
int cauta2(int li, int ls){
//cea mai mica poz care un elem mai mare/egal ca val
if(li==ls){
if(v[li]>=val)return li;
return -1;
}
if(li<ls){//am cel putin doua elemente
int mij=li+((ls-li)>>1)+1;//daca am exact doua, mij va fi al doilea
if(v[mij]>=val){
if(v[mij-1]<val)return mij;
return cauta2(li,mij-1);
}
if(v[mij]<val) return cauta2(mij+1,ls);//trebuie sa caut in prima jumatate
}
}
int main(){
int n,m;
fin=fopen("cautbin.in","r");
FILE *fout=fopen("cautbin.out","w");
cit(n);
int i;
for(i=0;i<n;i++)
cit(v[i]);
cit(m);
int cod,x,aux;
for(i=0;i<m;i++){
cit(cod);
cit(x);
switch(cod){
case 0: val=x;aux=cauta0(0,n-1)+1;
break;
case 1: val=x;aux=cauta1(0,n-1)+1;
break;
case 2: val=x;aux=cauta2(0,n-1)+1;
break;
}
fprintf(fout,"%d\n",aux);
}
fclose(fin);
fclose(fout);
return 0;
}