codeforces 438D

在大大推荐下这个标题不明的人做。而我的最后一个非常喜欢的段树,因此,愤怒出手。认为基本上相同。大值,当最大值小于取模时能够剪枝。
今后再遇到此类问题算是能攻克了
// file name: d.cpp                               //
// author: huangjipeng                               //
// creat time: 2014年05月26日 星期一 16时40分18秒    //
///////////////////////////////////////////////////////
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 100005
struct node
{
	int l,r;
	int mid;
	long long maxx;
	long long sum;
}tree[MAXN<<2];
void build(int l,int r,int now)
{
	tree[now].l=l;
	tree[now].r=r;
	tree[now].mid=(l+r)>>1;
	if(l==r)
	{
		scanf("%I64d",&tree[now].maxx);
		tree[now].sum=tree[now].maxx;
		return ;
	}
	build(l,tree[now].mid,now<<1);
	build(tree[now].mid+1,r,now<<1|1);
	tree[now].sum=(tree[now<<1].sum+tree[now<<1|1].sum);
	tree[now].maxx=max(tree[now<<1].maxx,tree[now<<1|1].maxx);
}
long long query(int l,int r,int now)
{
	if(tree[now].l==l && tree[now].r==r)
		return tree[now].sum;
	if(l>tree[now].mid)
		return query(l,r,now<<1|1);
	else if(r<=tree[now].mid)
		return query(l,r,now<<1);
	else
		return query(l,tree[now].mid,now<<1)+query(tree[now].mid+1,r,now<<1|1);
}
void update(int l,int r,long long x,int now)
{
	if(tree[now].maxx<x)
		return ;
	if(tree[now].l==tree[now].r)
	{
		tree[now].sum=tree[now].sum%x;
		tree[now].maxx=tree[now].sum;
		return ;
	}
	if(l>tree[now].mid)
		update(l,r,x,now<<1|1);
	else if(r<=tree[now].mid)
		update(l,r,x,now<<1);
	else
	{
		update(l,tree[now].mid,x,now<<1);
		update(tree[now].mid+1,r,x,now<<1|1);
	}
	tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
	tree[now].maxx=max(tree[now<<1].maxx,tree[now<<1|1].maxx);
}
void op3(int k,long long x,int now)
{
	if(tree[now].l==k && tree[now].r==k)
	{
		tree[now].maxx=tree[now].sum=x;
		return ;
	}
	if(k>tree[now].mid)
		op3(k,x,now<<1|1);
	else
		op3(k,x,now<<1);
	tree[now].sum=(tree[now<<1].sum+tree[now<<1|1].sum);
	tree[now].maxx=max(tree[now<<1].maxx,tree[now<<1|1].maxx);
}
int main()
{
	int n,m;
	cin>>n>>m;
	build(1,n,1);
	while(m--)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int l,r;
			scanf("%d%d",&l,&r);
			cout<<query(l,r,1)<<endl;
		}
		else if(op==2)
		{
			int l,r;
			long long x;
			scanf("%d%d%I64d",&l,&r,&x);
			update(l,r,x,1);
		}
		else if(op==3)
		{
			int k;
			long long x;
			scanf("%d%I64d",&k,&x);
			op3(k,x,1);
		}
	}
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-09-17 10:27  phlsheji  阅读(206)  评论(0编辑  收藏  举报