Ocean的礼物

版权声明: https://blog.csdn.net/blackneed/article/details/81699652

 Ocean的礼物

Time Limit: 5 s      Memory Limit: 128 MB     

Submit My Status

Problem Description

       皇家理工存在一段很神奇的路段,这段路由nn个格子组成,每个格子都有一个数字,你可以走这段路的任意一段。这段路的神奇之处就在于,如果你所处的这个格子数字和你经过的前一个格子数字不相同的话,你就可以获得一个礼物(初始一定可以获得礼物)。现在Ocean想知道,给定任意路段的左边界和右边界,问若走这段路可以获得多少礼物。不过幸运的是,Ocean很快就解决了,并且获得了大量的礼物。玩的十分开心。但是有一天,这段路神奇的发生了改变。它不但会给你礼物。它还可能随时的改变其任意某处的格子上的数字。这下Ocean可就犯愁了,他想知道任意一段路可以获得的礼物是多少。聪明的你可以帮下他吗?

Input

第一行输入一个整数nn,代表格子数。(1≤n≤106)(1≤n≤106)

第二行输入nn个整数xx。(1≤x≤108)(1≤x≤108)

第三行输入一个整数mm,代表mm次操作。(1≤m≤2∗105)(1≤m≤2∗105)

接下来第四行到3+m3+m行每行33个数op,x,yop,x,y。

若op=1op=1则把xx处的数修改为yy。(1≤x≤n,1≤y≤108)(1≤x≤n,1≤y≤108)

若op=2op=2,询问区间[x,y][x,y]内可以获得的礼物数。(1≤x≤y≤n)(1≤x≤y≤n)

Output

对于每个询问输出一个整数,代表可以获得的礼物数

Sample Input

6
1 2 3 4 5 6
4
2 1 6
1 2 3
2 2 3
2 3 4

Sample Output

6
1
2

AC代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 1e6 + 5;
struct node{
	int value;
	int visr;
	int visl;
}tree[MAXN<<2];
int n,m,x,y,q;
void Pushup(int re)
{
	tree[re].value=tree[re<<1].value+tree[re<<1|1].value;
	tree[re].visl=tree[re<<1].visl;
	tree[re].visr=tree[re<<1|1].visr;
	if(tree[re<<1].visr==tree[re<<1|1].visl) tree[re].value--;
}
void BuildTree(int i,int left,int right){
	if(left == right){
		scanf("%d",&tree[i].visl);
		tree[i].visr = tree[i].visl;
		tree[i].value = 1;
		return;
	}
	int mid = left+right>>1;
	BuildTree(i<<1,left,mid);
	BuildTree(i<<1|1,mid+1,right);
	Pushup(i);
}
void Update(int i,int left,int right,int pos,int val){
	if(left ==right){
		tree[i].visr = val;
		tree[i].visl = val;
		return;
	}
	int mid = left+right>>1;
	if(pos<=mid) Update(i<<1,left,mid,pos,val);
	else Update(i<<1|1,mid+1,right,pos,val);
	Pushup(i);
}
int Query(int i,int l,int r,int L,int R){
		if(L<=l && R>=r) return tree[i].value;
		int ans=0,mid=l+r>>1;
		if(L<=mid) ans+=Query(i<<1,l,mid,L,R);
		if(R>mid) ans+=Query(i<<1|1,mid+1,r,L,R);
		if(L<=mid && R>mid && tree[i<<1].visr==tree[i<<1|1].visl) ans--;
		return ans;
}
int main()
{
	int n,m,q,y,l,r;
    scanf("%d",&n);
    BuildTree(1,1,n);
	scanf("%d",&m);
	while(m--){
		scanf("%d%d%d",&q,&x,&y);
		if(q==1) Update(1,1,n,x,y);	
		else  printf("%d\n",Query(1,1,n,x,y));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/blackneed/article/details/81699652