【TJOI 2018】数学计算
阅读原文时间:2023年07月16日阅读:1

【题目链接】

点击打开链接

【算法】

线段树维护区间乘积

【代码】

#include
using namespace std;
#define MAXQ 100010

struct SegmentTree
{
int l,r;
long long sum;
} Tree[MAXQ<<];

int T,i,q,op,pos;
long long p,m;

inline void build(int index,int l,int r)
{
int mid;
Tree[index].l = l; Tree[index].r = r;
Tree[index].sum = ;
if (l == r) return;
mid = (l + r) >> ;
build(index<<,l,mid); build(index<<|,mid+,r); } inline void update(int index) { Tree[index].sum = (Tree[index<<].sum * Tree[index<<|].sum) % p; } inline void modify(int index,int pos,long long val) { int mid; if (Tree[index].l == Tree[index].r) { Tree[index].sum = val % p; return; } mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= pos) modify(index<<,pos,val);
else modify(index<<|,pos,val);
update(index);
}

int main()
{

    scanf("%d",&T);  
    while (T--)  
    {  
            scanf("%d%d",&q,&p);  
            build(,,q);  
            for (i = ; i <= q; i++)  
            {  
                    scanf("%d",&op);  
                    if (op == )  
                    {  
                            scanf("%lld",&m);  
                            modify(,i,m);  
                            printf("%lld\\n",Tree\[\].sum);  
                    } else  
                    {  
                            scanf("%d",&pos);  
                            modify(,pos,);  
                            printf("%lld\\n",Tree\[\].sum);  
                    }  
            }  
    }

    return ;

}