グリード大陸
トピックの背景
クレイジーアリの攻撃の顔は、小さなFFのタワーの防衛は、人間がグリードアイランド上だけベイにアリです......失敗しました。さて、後方FFは海で、フロントスーパーアリのバリエーションです。小型FF有望な未来がありますが、彼はここでの生活の損失にしたくなかったので、彼は最後のバッチ変換SCVは、アリの攻撃をブロックするように地雷を配置された彼の人を送りました。
防衛の小さなFF最後の行は、長さNの溝である、多数の小FF様々な鉱山を有し、それぞれがSCVであってもよい\([L、R] \ ) 前に既に地雷の敷設に同一の敷設異なっている範囲です。ケースが緊急となっているので、いくつかの点で小さなFFはあなたを求めることができる([L「R」\ ] \) の範囲内でどのように多くの異なる鉱山、彼はあなたができるだけ早く返信したいと考えています。
入力フォーマット:
整数の2幕最初の\(N- \)と\(m個\) ; \ (N- \)は防御の長さを表し、\(m個\)は、回数及び小鉱山SCVのFF照会の合計を表します。
そこ\(m個\)三つの整数の行\(Q \)、\ (Lの\) 、\(R&LT \) ;場合\(Q = 1 \)は SCV示し\([LをR&LT] \)織布鉱山にこの間隔、もし\(Q = 2 \) 、小電流クエリFFの前記\([L、R] \ ) 鉱山の種類の間隔の合計数。
出力フォーマット:
常に小さなFFを求める、答え(単線)の出力は、地雷の総数の現在の範囲ことを示しています。
サンプル入力:
5 4 1 3 2 2 5 1 2 4 2 3 5
出力例:
1 2
データ範囲:
データの30%:\(0 <= N、M <= 1000 \) ;
データの100%に:\(0 <= N、M <= 10 5 ^ \) 。
制限時間:
1S
スペースの制限:
50M
ヒント:
削除!
問題の解決策
探している\(Lの\)をする(R&LT \)\、鉱山は、排出部の排出に応じてあり、それぞれ配置された地雷が同じではないので、どのように多くの鉱山との間を
、次いで限り1として(Lの\)\の鉱山いくつか(すなわち、1から\(Lの\)鉱山の数を確定開始)にマイナス1 \(R-1 \)鉱山の終わりには配置されている(すなわち、鉱山を配置\ R&LT(\ ))種の数が答えです。
シンプルに続いて、2つのフェンウィックツリーは、2つのプレフィックスを維持し、うまく。
コードの場合:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int q,l,r;
int a1[100009],a2[100009];
int lb(int x){
return x&(-x);
}
void add1(int x){
while(x<=n){
a1[x]++;
x+=lb(x);
}
}
void add2(int x){
while(x<=n){
a2[x]++;
x+=lb(x);
}
}
int ask1(int x){
int ans=0;
while(x){
ans+=a1[x];
x-=lb(x);
}
return ans;
}
int ask2(int x){
int ans=0;
while(x){
ans+=a2[x];
x-=lb(x);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&q,&l,&r);
if(q==1){
add1(l);
add2(r);
}
else if(q==2) printf("%d\n",ask1(r)-ask2(l-1));
}
return 0;
}