#include #include #include #include #include using namespace std; void varianta_1(unsigned int v[], unsigned int n, unsigned int s) { for(unsigned int i = 0; i < n; i++) { if(v[i] >= s/2) break; unsigned int x = s - v[i]; for(unsigned int j = i + 1; j < n; j++) { if(v[j] == x) { cout << v[i] << ' ' << x << endl; break; } if(v[j] > x) break; } } } void varianta_2(unsigned int v[], unsigned int n, unsigned int s){ for(unsigned int i = 0; i < n; i++) { if(v[i] >= s/2) break; unsigned int x = s - v[i]; unsigned int st = i + 1, dr = n-1; while (st <= dr){ unsigned int mij = (st + dr)/2; if (v[mij] == x){ cout << v[i] << ' ' << x << endl; break; } else { if (x < v[mij]){ dr = mij-1; } else { st = mij + 1; } } } } } void generareTeste(const char nume_fisier[], unsigned int n) { unsigned int i, vcrt, r, x, y; srand(time(NULL)); ofstream fout(nume_fisier); fout << n << endl; //primul numar este cuprins intre 1 si 100 vcrt = 1 + (rand() * rand()) % 100; fout << vcrt << " "; //restul elementelor vor fi cuprinse intre vcrt+1 si vcrt+1000 x = y = 0; for(i = 1; i < n; i++) { r = 1 + (rand() * rand()) % 1000; vcrt = vcrt + r; //sansele ca r >= 500 sunt, teoretic, 50% if(r >= 500) if(x == 0) x = vcrt; else if(y == 0) y = vcrt; fout << vcrt << " "; } fout << endl << x + y << endl; fout.close(); } void citireDate(const char nume_fisier[], unsigned int v[], unsigned int &n, unsigned int &s) { ifstream fin(nume_fisier); fin >> n; for(int i = 0; i < n; i++) fin >> v[i]; fin >> s; fin.close(); } unsigned int v[1000000]; int main() { unsigned int n, s; generareTeste("preturi.in", 1000000); citireDate("preturi.in", v, n, s); varianta_1(v, n, s); cout << endl; varianta_2(v, n, s); return 0; }