Cod sursa(job #163258)

Utilizator filipbFilip Cristian Buruiana filipb Data 21 martie 2008 20:47:55
Problema Progresii Scor Ascuns
Compilator cpp Status done
Runda Marime 1.44 kb
   #include <stdio.h>  
   #include <assert.h>  
      
   #define ll long long  
      
   int N, M, P[100005], sol[100005];  
   ll K, X, last[100005], st;  
      
   int main(void)  
   {  
       int i, j, l, r, m;  
         
       freopen("progresii.in", "r", stdin);  
       freopen("progresii.out", "w", stdout);  
     
       scanf("%d %d %lld %lld", &N, &M, &K, &X);  
       assert(1 <= N && N <= 100000);  
       assert(1 <= M && M <= 2000000000);  
       assert(1 <= K && K <= ((ll)1<<60) && 1 <= X && X <= ((ll)1<<60));  
         
       for (i = 1; i <= N; ++i)  
       {  
           scanf("%d", &P[i]);  
	   assert(1 <= P[i] && P[i] <= 2000000000);
	   assert(1 <= P[i] && P[i] <= X);  
       }  
         
       for (i = N; i; --i)      
           last[i] = last[i+1] + (X >= P[i] ? 1+(X-P[i])/M : 0);  
       for (i = 1; i <= N; ++i)  
       {  
           for (l = 1, r = M, j = -1; l <= r; )  
           {  
               m = ((unsigned)l + r) / 2;  
               if (st + last[i+1] + (X >= P[i] ? 1+(X-P[i])/m : 0) <= K)  
                   j = m, r = m-1;  
               else  
                   l = m+1;  
           }  
           if (j == -1)  
           {  
               printf("-1\n");  
               return 0;  
           }  
           sol[i] = j;  
           st += (X >= P[i] ? 1+(X-P[i])/j : 0);
      }  
     
      for (i = 1; i <= N; ++i)  
          printf("%d\n", sol[i]);  
     
       return 0;  
   }