hdu 3074 求区间乘积
2024-08-31 07:25:45
线段树水题
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std; #define LL(x) (x<<1)
#define RR(x) ((x<<1)|1)
long long num[4*50000];
int update(int L,int R,int pos,int k,int mark)
{
if(L==pos&&R==pos)
{
num[mark]=k;
return 0;
}
int mid=(L+R)/2;
if(pos<=mid)
{
update(L,mid,pos,k,LL(mark));
}
else
{
update(mid+1,R,pos,k,RR(mark));
}
num[mark]=(num[LL(mark)]%1000000007)*(num[RR(mark)]%1000000007)%1000000007;
return 0;
}
long long find(int L,int R,int left,int right,int mark)
{
long long sum=1;
if(L==left&&R==right)
{
sum=num[mark];
return sum;
}
int mid=(L+R)/2;
if(right<=mid)
{
sum=find(L,mid,left,right,LL(mark));
}
else if(left>mid)
{
sum=find(mid+1,R,left,right,RR(mark));
}
else
{
sum=(find(L,mid,left,mid,LL(mark))%1000000007)*(find(mid+1,R,mid+1,right,RR(mark))%1000000007)%1000000007;
}
return sum;
}
int main()
{
int n,m,T,i,j,a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=4*n;i++)
num[i]=1;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
update(1,n,i,a,1);
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&c,&a,&b);
if(c==0)
{
printf("%lld\n",find(1,n,a,b,1));
}
else
{
update(1,n,a,b,1);
}
}
}
return 0;
}
最新文章
- [转]Fiddler抓取Android真机上的HTTPS包
- C语言中使用系统自带的快排函数
- redis 原子增一的妙用
- hibernate(十)双向关联关系的CRUD
- 掌握 Ajax,第 1 部分: Ajax 入门简介
- 【转载】使用SQL Server维护计划实现数据库定时自动备份
- UIImageView旋转任意角度
- httpd配置Gzip压缩
- shiro能做什么,做j2ee时候要考虑什么
- windows服务,安装、启动、停止,配置,一个批处理文件搞定
- Andoid源码 BUG修改集合--不断更新
- WPF画N角芒星,正N角星
- Performing Post-Build Event之类的编译错误
- MVC 5 + EF6 完整教程16 -- 控制器详解
- php 压缩函数gzencode gzdeflate gzcompress
- 第 1 章 JS变量、作用域
- odoo系统中name_search和name_get用法
- HDFS shell操作及HDFS Java API编程
- .net core2 mvc项目中,加入RazorPages页面
- Hadoop日记Day14---MapReduce源代码回顾总结