Pagini recente » Cod sursa (job #1424313) | Cod sursa (job #2198247) | Cod sursa (job #886343) | Cod sursa (job #223830) | Cod sursa (job #1759900)
#include <fstream>
#include <vector>
#include <algorithm>
struct file_manip {
std::ifstream fin;
std::ofstream fout;
file_manip(const char* filename) {
std::string infilename = std::string(filename) + ".in";
std::string outfilename = std::string(filename) + ".out";
fin.open(infilename.c_str());
fout.open(outfilename.c_str());
}
template <class T>
file_manip& operator << (const T& rhs) {
fout << rhs;
return *this;
}
template <class T>
file_manip& operator >> (T& rhs) {
fin >> rhs;
return *this;
}
};
int find_last(const std::vector<int> &v, int val)
{
int fst = 0;
int lst = v.size() - 1;
while (fst <= lst)
{
int m = (fst + lst) / 2;
if (v[m] < val) {
fst = m + 1;
}
else if (v[m] > val) {
lst = m - 1;
}
else {
if (fst == lst) {
return fst;
}
if (v[lst] == val) {
return lst;
}
if (fst == m) {
lst--;
}
else {
fst = m;
}
}
}
return -1;
}
int find_less_or_equal(const std::vector<int> &v, int val)
{
int fst = 0;
int lst = v.size() - 1;
while (fst != lst)
{
int m = (fst + lst) / 2;
if (v[m] > val)
{
lst = m - 1;
}
else if (fst == m) {
if (v[lst] <= val)
return lst;
return m;
}
else
{
fst = m;
}
}
return fst;
}
int find_greater_or_equal(const std::vector<int> &v, int val)
{
int fst = 0;
int lst = v.size() - 1;
while (fst != lst)
{
int m = (fst + lst) / 2;
if (v[m] < val)
{
fst = m + 1;
}
else if (lst == m)
{
return m;
}
else
{
lst = m;
}
}
return fst;
}
int main()
{
file_manip fm("cautbin");
int n, m;
int op, idx, x;
std::vector<int> v;
fm >> n;
v.reserve(n);
for (int i = 0; i < n; ++i)
{
fm >> m;
v.push_back(m);
}
fm >> m;
while (m--)
{
fm >> op >> idx;
if (op == 0)
{
x = find_last(v, idx);
if (x == -1)
x -= 1;
fm << x + 1 << "\n";
}
if (op == 1)
{
x = find_less_or_equal(v, idx);
fm << x + 1 << "\n";
}
if (op == 2)
{
x = find_greater_or_equal(v, idx);
fm << x + 1 << "\n";
}
}
return 0;
}