#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> struct segtree_Point_Prod{
int N;
int logN;
T * mul;
void malloc ( int maxN, int once = 0 ) {
int i;
for ( i= 1 ; i< maxN; i* = 2 ) {
;
}
mul = new T[ 2 * i] ;
if ( once) {
setN( maxN) ;
}
}
void walloc( int maxN, int once = 0 , void ** mem = & wmem) {
int i;
for ( i= 1 ; i< maxN; i* = 2 ) {
;
}
walloc1d( & mul, 2 * i, mem) ;
if ( once) {
setN( maxN) ;
}
}
void free ( void ) {
delete [ ] mul;
}
T& operator[ ] ( int i) {
return mul[ N+ i] ;
}
void setN( int n, int zerofill = 1 , int dobuild = 1 ) {
int i;
for ( i= 1 ,logN= 0 ; i< n; i* = 2 ,logN++ ) {
;
}
N = i;
if ( zerofill) {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
mul[ N+ i] = 0 ;
}
}
if ( dobuild) {
build( ) ;
}
}
void build( void ) {
int i;
for ( i= N- 1 ; i; i-- ) {
mul[ i] = mul[ 2 * i] * mul[ 2 * i+ 1 ] ;
}
}
inline void build( int a) {
while ( a > 1 ) {
a / = 2 ;
mul[ a] = mul[ a* 2 ] * mul[ a* 2 + 1 ] ;
}
}
inline void change( int a, T val) {
mul[ a+ N] = val;
build( a+ N) ;
}
inline void add( int a, T val) {
mul[ a+ N] + = val;
build( a+ N) ;
}
inline T getProd( int a, int b) {
T res;
T tmp;
int fga = 0 ;
int fgb = 0 ;
a + = N;
b + = N;
while ( a < b) {
if ( a% 2 ) {
if ( fga) {
res = res * mul[ a] ;
}
else {
res = mul[ a] ;
fga = 1 ;
}
a++ ;
}
if ( b% 2 ) {
b-- ;
if ( fgb) {
tmp = mul[ b] * tmp;
}
else {
tmp = mul[ b] ;
fgb = 1 ;
}
}
a / = 2 ;
b / = 2 ;
}
if ( fga== 1 && fgb== 0 ) {
return res;
}
if ( fga== 0 && fgb== 1 ) {
return tmp;
}
if ( fga== 1 && fgb== 1 ) {
res = res * tmp;
return res;
}
return res;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
int fg;
int cnt;
segtree_Point_Prod< unsigned > t;
class ProductOfNumbers{
public :
ProductOfNumbers( ) {
if ( fg== 0 ) {
fg = 1 ;
t.malloc ( 40000 ) ;
}
t.setN ( 40000 ,1 ,0 ) ;
t.build ( ) ;
cnt = 0 ;
}
void add( int num) {
t.change ( cnt++ , num) ;
}
int getProduct( int k) {
return t.getProd ( cnt- k, cnt) ;
}
}
;
// cLay varsion 20200214-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int fg, cnt;
// segtree_Point_Prod<unsigned> t;
//
// class ProductOfNumbers {
// public:
// ProductOfNumbers() {
// if(fg==0){
// fg = 1;
// t.malloc(40000);
// }
// t.setN(40000,1,0);
// t.build();
// cnt = 0;
// }
//
//
// void add(int num) {
// t.change(cnt++, num);
// }
//
// int getProduct(int k) {
// return t.getProd(cnt-k, cnt);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3Qgc2VndHJlZV9Qb2ludF9Qcm9kewogIGludCBOOwogIGludCBsb2dOOwogIFQgKm11bDsKICB2b2lkIG1hbGxvYyhpbnQgbWF4TiwgaW50IG9uY2UgPSAwKXsKICAgIGludCBpOwogICAgZm9yKGk9MTtpPG1heE47aSo9Mil7CiAgICAgIDsKICAgIH0KICAgIG11bCA9IG5ldyBUWzIqaV07CiAgICBpZihvbmNlKXsKICAgICAgc2V0TihtYXhOKTsKICAgIH0KICB9CiAgdm9pZCB3YWxsb2MoaW50IG1heE4sIGludCBvbmNlID0gMCwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICAgIGludCBpOwogICAgZm9yKGk9MTtpPG1heE47aSo9Mil7CiAgICAgIDsKICAgIH0KICAgIHdhbGxvYzFkKCZtdWwsIDIqaSwgbWVtKTsKICAgIGlmKG9uY2UpewogICAgICBzZXROKG1heE4pOwogICAgfQogIH0KICB2b2lkIGZyZWUodm9pZCl7CiAgICBkZWxldGUgW10gbXVsOwogIH0KICBUJiBvcGVyYXRvcltdKGludCBpKXsKICAgIHJldHVybiBtdWxbTitpXTsKICB9CiAgdm9pZCBzZXROKGludCBuLCBpbnQgemVyb2ZpbGwgPSAxLCBpbnQgZG9idWlsZCA9IDEpewogICAgaW50IGk7CiAgICBmb3IoaT0xLGxvZ049MDtpPG47aSo9Mixsb2dOKyspewogICAgICA7CiAgICB9CiAgICBOID0gaTsKICAgIGlmKHplcm9maWxsKXsKICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgbXVsW04raV0gPSAwOwogICAgICB9CiAgICB9CiAgICBpZihkb2J1aWxkKXsKICAgICAgYnVpbGQoKTsKICAgIH0KICB9CiAgdm9pZCBidWlsZCh2b2lkKXsKICAgIGludCBpOwogICAgZm9yKGk9Ti0xO2k7aS0tKXsKICAgICAgbXVsW2ldID0gbXVsWzIqaV0gKiBtdWxbMippKzFdOwogICAgfQogIH0KICBpbmxpbmUgdm9pZCBidWlsZChpbnQgYSl7CiAgICB3aGlsZShhID4gMSl7CiAgICAgIGEgLz0gMjsKICAgICAgbXVsW2FdID0gbXVsW2EqMl0gKiBtdWxbYSoyKzFdOwogICAgfQogIH0KICBpbmxpbmUgdm9pZCBjaGFuZ2UoaW50IGEsIFQgdmFsKXsKICAgIG11bFthK05dID0gdmFsOwogICAgYnVpbGQoYStOKTsKICB9CiAgaW5saW5lIHZvaWQgYWRkKGludCBhLCBUIHZhbCl7CiAgICBtdWxbYStOXSArPSB2YWw7CiAgICBidWlsZChhK04pOwogIH0KICBpbmxpbmUgVCBnZXRQcm9kKGludCBhLCBpbnQgYil7CiAgICBUIHJlczsKICAgIFQgdG1wOwogICAgaW50IGZnYSA9IDA7CiAgICBpbnQgZmdiID0gMDsKICAgIGEgKz0gTjsKICAgIGIgKz0gTjsKICAgIHdoaWxlKGEgPCBiKXsKICAgICAgaWYoYSUyKXsKICAgICAgICBpZihmZ2EpewogICAgICAgICAgcmVzID0gcmVzICogbXVsW2FdOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgcmVzID0gbXVsW2FdOwogICAgICAgICAgZmdhID0gMTsKICAgICAgICB9CiAgICAgICAgYSsrOwogICAgICB9CiAgICAgIGlmKGIlMil7CiAgICAgICAgYi0tOwogICAgICAgIGlmKGZnYil7CiAgICAgICAgICB0bXAgPSBtdWxbYl0gKiB0bXA7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICB0bXAgPSBtdWxbYl07CiAgICAgICAgICBmZ2IgPSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBhIC89IDI7CiAgICAgIGIgLz0gMjsKICAgIH0KICAgIGlmKGZnYT09MSAmJiBmZ2I9PTApewogICAgICByZXR1cm4gcmVzOwogICAgfQogICAgaWYoZmdhPT0wICYmIGZnYj09MSl7CiAgICAgIHJldHVybiB0bXA7CiAgICB9CiAgICBpZihmZ2E9PTEgJiYgZmdiPT0xKXsKICAgICAgcmVzID0gcmVzICogdG1wOwogICAgICByZXR1cm4gcmVzOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9Cn0KOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHdtZW0gPSBtZW1hcnI7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KaW50IGZnOwppbnQgY250OwpzZWd0cmVlX1BvaW50X1Byb2Q8dW5zaWduZWQ+IHQ7CmNsYXNzIFByb2R1Y3RPZk51bWJlcnN7CiAgcHVibGljOgogIFByb2R1Y3RPZk51bWJlcnMoKXsKICAgIGlmKGZnPT0wKXsKICAgICAgZmcgPSAxOwogICAgICB0Lm1hbGxvYyg0MDAwMCk7CiAgICB9CiAgICB0LnNldE4oNDAwMDAsMSwwKTsKICAgIHQuYnVpbGQoKTsKICAgIGNudCA9IDA7CiAgfQogIHZvaWQgYWRkKGludCBudW0pewogICAgdC5jaGFuZ2UoY250KyssIG51bSk7CiAgfQogIGludCBnZXRQcm9kdWN0KGludCBrKXsKICAgIHJldHVybiB0LmdldFByb2QoY250LWssIGNudCk7CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMjAwMjE0LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gaW50IGZnLCBjbnQ7Ci8vIHNlZ3RyZWVfUG9pbnRfUHJvZDx1bnNpZ25lZD4gdDsKLy8gCi8vIGNsYXNzIFByb2R1Y3RPZk51bWJlcnMgewovLyBwdWJsaWM6Ci8vICAgUHJvZHVjdE9mTnVtYmVycygpIHsKLy8gICAgIGlmKGZnPT0wKXsKLy8gICAgICAgZmcgPSAxOwovLyAgICAgICB0Lm1hbGxvYyg0MDAwMCk7Ci8vICAgICB9Ci8vICAgICB0LnNldE4oNDAwMDAsMSwwKTsKLy8gICAgIHQuYnVpbGQoKTsKLy8gICAgIGNudCA9IDA7Ci8vICAgfQovLyAKLy8gCi8vICAgdm9pZCBhZGQoaW50IG51bSkgewovLyAgICAgdC5jaGFuZ2UoY250KyssIG51bSk7Ci8vICAgfQovLyAKLy8gICBpbnQgZ2V0UHJvZHVjdChpbnQgaykgewovLyAgICAgcmV0dXJuIHQuZ2V0UHJvZChjbnQtaywgY250KTsKLy8gICB9Ci8vIH07Cg==