【题目链接】
【算法】
线段树维护区间乘积
【代码】
#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 ;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章