1. 程式人生 > >Loj#10115. 「一本通 4.1 例 3」校門外的樹(升級)

Loj#10115. 「一本通 4.1 例 3」校門外的樹(升級)

描述

校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的……
如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作:
K=1,K=1,讀入l、r表示在區間[l,r]中種上一種樹,每次操作種的樹的種類都不同
K=2,讀入l,r表示詢問l~r之間能見到多少種樹
(l,r>0)

格式

輸入格式

第一行n,m表示道路總長為n,共有m個操作
接下來m行為m個操作

輸出格式

對於每個k=2輸出一個答案

樣例1

樣例輸入1

5 4
1 1 3
2 2 5
1 2 4
2 3 5
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=500040;
int a[maxn],b[maxn];
int n,m;
int lowbit(int x)
{
	return x&(-x);
}
void add1(int x,int y)
{
	while(x<=n)
	{
		a[x]+=y;
		x+=lowbit(x);
	}
}
void add2(int x,int y)
{
	while(x<=n)
	{
		b[x]+=y;
		x+=lowbit(x);
	}
}

int sum1(int x)
{
	int ans=0;
	while(x>0)
	{
		ans+=a[x];
		x-=lowbit(x);
	}
	return ans;
}
int sum2(int x)
{
	int ans=0;
	while(x>0)
	{
		ans+=b[x];
		x-=lowbit(x);
	}
	return ans;
}
int main(){
	cin>>n>>m;
	while(m--)
	{
		int wzx,x,y;
		scanf("%d",&wzx);
		if(wzx==1)
		{
			scanf("%d %d",&x,&y);
			add1(x,1);
			add2(y,1);
		}
		if(wzx==2)
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",sum1(y)-sum2(x-1));
		}
	}
	return 0;
}

樣例輸出1

1
2

限制

1s

提示

範圍:20%的資料保證,n,m<=100
60%的資料保證,n <=1000,m<=50000
100%的資料保證,n,m<=50000