【TJOI2018】数学计算

题目链接

没质数搞不了逆元。

发现2操作在去除之前某1操作的影响,然后要求维护连乘。

单点修改,区间询问。维护区间积。

上线段树。

区间询问还是全区间的,没有懒标记,没有查询函数。

 

代码(100分):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define IL inline
#define RG register
#define _1 first
#define _2 second
using namespace std;
typedef long long LL;
const int N=1e5;

    int n;
    LL mod,a[N+3];
    LL s[N*4+3];
    
IL int ls(int i){return i<<1;}
IL int rs(int i){return i<<1|1;}
    
void mdf(int i,int l,int r,int p,LL x){
    if(l==r){
        s[i]=x;    return ;
    }
    
    int mid=(l+r)>>1;
    if(p<=mid)
        mdf(ls(i),l,mid,p,x);
    else 
        mdf(rs(i),mid+1,r,p,x);
    s[i]=s[ls(i)]*s[rs(i)]%mod;
    
}

IL void sol(){
    scanf("%d%lld",&n,&mod);
    for(int i=1;i<=n*4;i++)
        s[i]=1;
    for(int i=1;i<=n;i++){
        int opt;
        scanf("%d",&opt);
        if(opt==1){
            LL m;
            scanf("%lld",&m);
            mdf(1,1,n,i,m);
            printf("%lld\n",s[1]);
            
        }
        else {
            int p;
            scanf("%d",&p);
            mdf(1,1,n,p,1);
            printf("%lld\n",s[1]);
            
        }
        
    }
    
}

int main(){
    int t;
    scanf("%d",&t);
    while(t--)
        sol();

    return 0;

}
View Code

 

posted @ 2020-05-27 22:26  汉谡  阅读(159)  评论(0编辑  收藏  举报