Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstdio>
  3. #include <cstring>
  4.  
  5. const char IN [ ] = "j.in" ;
  6. const char OUT [ ] = "j.out" ;
  7. const int MAX = 100014 ;
  8.  
  9. using namespace std;
  10.  
  11. #define fin cin
  12. #define fout cout
  13.  
  14. //ifstream fin ( IN ) ;
  15. //ofstream fout ( OUT ) ;
  16.  
  17. long long AINTstanga [ MAX * 8 ] ;
  18. long long putb [ MAX ] ;
  19. long long val , P , B ; int pos ;
  20.  
  21. inline void update ( int nod , int st , int dr )
  22. {
  23.     if ( st == dr )
  24.     {
  25.         AINTstanga [ nod ] = val ;
  26.         return ;
  27.     }
  28.     int mij = ( st + dr ) >> 1 ;
  29.     if ( pos <= mij )
  30.         update ( nod << 1 , st , mij ) ;
  31.         else update ( nod << 1 | 1 , mij + 1 , dr ) ;
  32.     int put = dr - st ;
  33.     int put1 = mij - st ;
  34.     AINTstanga [ nod ] = ( AINTstanga [ nod << 1 ] * putb [ put - put1 ] + AINTstanga [ nod << 1 | 1 ] ) % P ;
  35. }
  36.  
  37. inline long long Query ( int nod , int st , int dr , int qst , int qdr )
  38. {
  39.     if ( qst <= st and dr <= qdr )
  40.     {
  41.         int putmax = qdr - st ;
  42.         int put_actual = dr - st ;
  43.         if ( st == dr )
  44.             putmax = qdr - st ;
  45.         return ( AINTstanga [ nod ] * putb [ putmax - put_actual ] ) % P;
  46.     }
  47.     int mij = ( st + dr ) >> 1 ;
  48.     long long SOL = 0 ;
  49.     if ( qst <= mij )
  50.         SOL = ( SOL + Query ( nod << 1 , st , mij , qst , qdr ) ) % P ;
  51.     if ( qdr > mij )
  52.         SOL = ( SOL + Query ( nod << 1 | 1, mij + 1 , dr , qst , qdr ) ) % P;
  53.     return SOL % P ;
  54. }
  55.  
  56. int main (              )
  57. {
  58.     while ( 1 )
  59.     {
  60.         memset ( AINTstanga , 0 , sizeof ( AINTstanga ) ) ;
  61.         long long L , N ;
  62.         scanf ( "%I64d %I64d %I64d %I64d" , &B , &P , &L , &N ) ;
  63.         if ( !B and !P and !L and !N )
  64.             break ;
  65.         putb [ 0 ] = 1 ;
  66.         for ( int i = 1 ; i <= L ; ++ i )
  67.             putb [ i ] = ( putb [ i - 1 ] * B ) % P ;
  68.         while ( N -- )
  69.         {
  70.             char C ;
  71.             scanf ( "%*c" ) ;
  72.             scanf ( "%c" , &C ) ;
  73.             if ( C == 'E' )
  74.             {
  75.                 int x ;
  76.                 scanf ( "%d" ,&x );
  77.                 pos = x ;
  78.                 scanf ( "%I64d" , &val ) ;
  79.                 update ( 1 , 1 , L ) ;
  80.             }
  81.             else {
  82.                 int i , j ;
  83.                 scanf ( "%d %d" , &i , &j ) ;
  84.                 printf ( "%I64d\n" , Query ( 1 , 1 , L , i , j ) ) ;
  85.             }
  86.         }
  87.         printf ( "-\n" ) ;
  88.  
  89.     }
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement