365
Cerința
Se dă un şir x format din n numere naturale nenule. Pentru fiecare element xi din şir să se verifice dacă există un număr k astfel încât elementul xi să fie egal cu suma primelor k elemente din şir.
Date de intrare
Fișierul de intrare summit.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.
Date de ieșire
Fișierul de ieșire summit.out va conține pe linia i valoarea k dacă elementul xi este egal cu suma primelor k elemente din şir, sau 0 în caz contrar, pentru fiecare i de la 1 la n.
Restricții și precizări
2 ≤ n ≤ 1.000.000- numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât
2.000.000.000
Exemplu
summit.in
3 1 2 3
summit.out
1 0 2
Explicație
Elementul x1=1 este suma primelor k=1 elemente din şir, elementul x2=2 nu poate fi scris ca suma primelor k elemente din şir oricare ar fi k, iar elementul x3=3 este suma primelor k=2 elemente din şir.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("summit.in");
ofstream cout("summit.out");
long long int s[1000001];
int cb(int n , int i)
{
int st = 1 , dr = i;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(s[mij]==n)
return mij;
if(s[mij]<n)
st = mij + 1;
else
dr = mij - 1;
}
return 0;
}
int main()
{
int n;
cin >> n;
int x;
for(int i = 1 ; i <= n ; ++i)
{
cin >> x;
s[i]=s[i-1]+x;
int val = cb(x , i);
if(s[val]==x)
cout << val << '\n';
else
cout << 0 << '\n';
}
return 0;
}
Comentarii