Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Diferente pentru monthly-2014/runda-9/solutii intre reviziile 11 si 10 | Cod sursa (job #205220)
Cod sursa(job #205220)
#include <stdio.h>
#define NMAX 100002
int a[NMAX],c[NMAX],n,m,i,j,k,w,p,q,s1,s2,suma,indice;
int Search(int val)
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= n)
{
if( val >= c[i+step] )
{
i += step, val -= c[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main()
{FILE *fin,*fout;
fin = fopen("aib.in" , "r");
fout = fopen("aib.out" , "w");
fscanf(fin , "%d %d" , &n , &m);
for (i = 1 ; i <= n ;i++)
{fscanf(fin , "%d" , &a[i]);
c[i] = 0;
k= i & (i ^ (i - 1));
for (j = i-k+1; j <= i;j++)
c[i] += a[j];
}
for (i = 1; i <= m; i++)
{fscanf(fin , "%d" , &w);
if (w == 2) fscanf(fin , "%d" , &suma);
else fscanf(fin , "%d %d" , &p ,&q);
if (w == 0){a[p] += q;
while (p <= n)
{c[p] = c[p] + q;
k= p & ( p^ (p - 1));
p = p + k;
}
}
if (w == 1) {s1 = 0;
while (q > 0)
{s1 += c[q];
k= q & ( q^ (q - 1));
q = q - k;
}
s2 = 0;
p--;
while (p > 0)
{s2 += c[p];
k = p &(p ^ (p - 1));
p = p - k;
}
fprintf(fout, "%d\n" ,s1 - s2);
}
if (w == 2) {/*s1 = 0;
indice = 0;
while (s1 < suma){
s1 = 0;
indice++;
q = indice;
while (q > 0)
{s1 += c[q];
k= q & ( q^ (q - 1));
q = q - k;
}
}
s1 = 0;
j = 0;
while (s1 < suma)
{
j++;
s1 += a[j];
}
if (s1 == suma) fprintf(fout , "%d\n" , j);
else fprintf(fout , "-1\n");
*/
fprintf(fout , "%d\n" , Search(suma));
}
}
fclose (fin);
fclose (fout);
return 0;
}