Loj#10115. 「一本通 4.1 例 3」校門外的樹(升級)
阿新 • • 發佈:2019-01-22
描述
校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的……
如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作:
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