【TJOI 2018】数学计算

【题目链接】

          点击打开链接

【算法】

              线段树维护区间乘积

【代码】

              

#include<bits/stdc++.h>
using namespace std;
#define MAXQ 100010

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

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 = 1;
      if (l == r) return;
      mid = (l + r) >> 1;
      build(index<<1,l,mid);
      build(index<<1|1,mid+1,r);
}
inline void update(int index)
{
        Tree[index].sum = (Tree[index<<1].sum * Tree[index<<1|1].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) >> 1;
        if (mid >= pos) modify(index<<1,pos,val);
        else modify(index<<1|1,pos,val);
        update(index);
}

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

 

posted @ 2018-06-16 19:16  evenbao  阅读(150)  评论(0编辑  收藏  举报