据说方法有很多,我想到的是线段树,处理点的线段树,在处理过程中可能超过int,要用long long。
附上代码:
#include<iostream>
#include<cstdio>
using namespace std;
struct list1{
int l,r;
long long value;
} tree[400000];
long long m;
int T,i,q,x,a[120000];
void build(int v,int l,int r)
{
tree[v].l=l;
tree[v].r=r;
tree[v].value=1 % m;
if (l==r) return;
int mid=(l+r)/2;
build(v*2,l,mid);
build(v*2+1,mid+1,r);
}
void update(int v,int x,long long v1)
{
if (tree[v].l==tree[v].r&&tree[v].l==x)
{
tree[v].value=v1 % m;
return;
}
else
{
int mid=(tree[v].l+tree[v].r)/2;
if (x<=mid) update(v*2,x,v1);
else update(v*2+1,x,v1);
tree[v].value=tree[v*2].value * tree[v*2+1].value % m;
}
}
int main()
{
scanf("%d",&T);
for (int I=1;I<=T;I++)
{
scanf("%d%d",&q,&m);
build(1,1,q);
printf("Case #%d:\n",I);
for (i=1;i<=q;i++)
{
scanf("%d%d",&x,&a[i]);
if (x==1) update(1,i,a[i]);
else if (x==2) update(1,a[i],1);
printf("%lld\n",tree[1].value % m);
}
}
}