Pagini recente » Cod sursa (job #1043163) | Cod sursa (job #1363229) | Rating Liliana Tudorica-Chrchev (LiliT) | Cod sursa (job #2214670) | Cod sursa (job #2949652)
#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;
}