Cod sursa(job #2949652)

Utilizator andreipirjol5Andrei Pirjol andreipirjol5 Data 1 decembrie 2022 13:07:12
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <cstdio>
#include <cmath>

using namespace std;
FILE *fin, *fout;

const int NMAX = 1e5;
int v[NMAX + 5], n;

struct sequence
{
    int start, finish;
};
sequence seq[NMAX + 5];

int cautbin(int number)
{
    int pos;

    for(int exp = log2(n); exp >= 0; exp--)
    {
        if(pos + (1 << exp) <= n and v[pos + (1 << exp)] <= number)
        {
            pos += (1 << exp);
        }
    }

    return pos;
}

int main()
{
    fin = fopen("cautbin.in", "r");
    fout = fopen("cautbin.out", "w");

    fscanf(fin, "%d", &n);

    fscanf(fin, "%d", &v[1]);
    seq[v[1]].start = 1;
    seq[v[1]].finish = 1;

    for(int i = 2; i <= n; i++)
    {
        fscanf(fin, "%d", &v[i]);

        if(v[i] == v[i - 1])
            seq[v[i]].finish++;
        else
        {
            seq[v[i]].start = i;
            seq[v[i]].finish = i;
        }
    }

    int no_tasks;
    fscanf(fin, "%d", &no_tasks);

    for(int i = 1; i <= no_tasks; i++)
    {
        int task, number;
        fscanf(fin, "%d%d", &task, &number);

        if(task == 0)
        {
            fprintf(fout, "%d\n", seq[v[cautbin(number)]].finish);
        }
        else if(task == 1)
        {
            int nr_index = cautbin(number);
            int start_index = seq[v[nr_index]].start, finish_index = seq[v[nr_index]].finish;

            if(start_index != finish_index)
                fprintf(fout, "%d\n", seq[v[nr_index]].finish);
            else
            {
                fprintf(fout, "%d\n", seq[v[nr_index]].start - 1);
            }
        }
        else if(task == 2)
        {
            int nr_index = cautbin(number);
            int start_index = seq[v[nr_index]].start, finish_index = seq[v[nr_index]].finish;

            if(start_index != finish_index)
                fprintf(fout, "%d\n", seq[v[nr_index]].start);
            else
            {
                fprintf(fout, "%d\n", seq[v[nr_index]].finish + 1);
            }
        }
    }

    fclose(fin);
    fclose(fout);
    return 0;
}