1. 程式人生 > >小旭追女神-三國亂世(裸的單點線段樹更新)

小旭追女神-三國亂世(裸的單點線段樹更新)

小旭追女神-三國亂世

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

最近室友都開始玩起來三國殺了,這讓小旭很鬱悶,(因為小旭不會啊),所以為了能和小夥伴們一起玩耍,小旭決定重讀三國,一天小旭晚上夢迴三國。 話說: 太祖武皇帝,沛國譙人也,姓曹,諱操,字孟德,漢相國參之後。桓帝世,曹騰為中常侍大長秋,封費亭侯。養子嵩嗣,官至太尉,莫能審其生出本末。嵩生太祖。:太祖一名吉利,小字阿瞞。王沈魏書曰:其先出於黃帝。當高陽世,陸終之子曰安,是為曹姓。周武王克殷,存先世之後,封曹俠於 邾。春秋之世,與於盟會,逮至戰國,為楚所滅。子孫分流,或家於沛。漢高祖之起,曹參以功封平陽侯,世襲爵土,絕而復紹,至今適嗣國於容城。司馬彪續漢書曰:騰父節,字元偉,素以仁厚稱。鄰人有亡豕者,與節豕相類,詣門認之,節不與爭;後所亡 豕自還其家,豕主人大慚,送所認豕,並辭謝節,節笑而受之。由是鄉黨貴嘆焉。長子伯興,次子仲興,次子叔興。騰字季興,少除黃門從官。永寧元年,鄧太后詔 黃門令選中黃門從官年少溫謹者配皇太子書,騰應其選。太子特親愛騰,飲食賞賜與觽有異。順帝即位,為小黃門,遷至中常侍大長秋。在省闥三十餘年,歷事四 帝,未嘗有過。 額。。。。。小旭進錯夢了,重來: 滾滾長江東逝水,浪花淘盡英雄。是非成敗轉頭空。 青山依舊在,幾度夕陽紅。白髮漁樵江渚上,慣 看秋月春風。一壺濁酒喜相逢。古今多少事,都付 笑談中。                 ——調寄《臨江仙》 話說天下大勢,分久必合,合久必分。週末七國分爭,併入於秦。及秦滅之後,楚、漢分爭,又併入於漢。漢朝自高祖斬白蛇而起義,一統天下,後來光武中興,傳至 獻帝,遂分為三國。推其致亂之由,殆始於桓、靈二帝。桓帝禁錮善類,崇信宦官。及桓帝崩,靈帝即位,大將軍竇武、太傅陳蕃共相輔佐。時有宦官曹節等弄權, 竇武、陳蕃謀誅之,機事不密,反為所害,中涓自此愈橫。 且說小旭在夢境中成為曹操手下的狗頭軍師(為什麼是軍師呢?我也不知道),小旭很是得意啊 說道: 掛印封金辭漢相,尋兄遙望遠途還。 馬騎赤兔行千里,刀偃青龍出五關。 忠義慨然衝宇宙,英雄從此震江山。 獨行斬將應無敵,今古留題翰墨間。 至於小旭為什麼會說這首詩我也不知知道 ,可能精神錯亂了吧。 一天,曹操找小旭 曹操:小旭軍師,本王找你幫我做點事。 小旭:大王請直言。 曹操:好,現在劉備大勢已成,我要加強防備,現在請軍師將16號軍營增加5人。 小旭:遵命。 曹操:將8號軍營增加1人。 小旭:遵命。 曹操:從第8營到第12營共有多少人? 小旭:。。。。。。 曹操:這都不知道,來人拉出去斬了。 小旭嚇的 趕緊給資料結構教授打電話(不要問我三國為什麼會有電話,任性)。 教授:讓你平時不好好刷題,自己解決。 你能幫小旭解決之個問題嗎?

Input

多組輸入,每組資料第一行是兩個整數n,m(1 < = n,m < = 1000000),接下來一行是n個數,代表相對應的軍營的人數。接下來m行,每行可能的操作:1 UPDATE x d,表示第x個軍營人數增加d(0 = < d < = 100), 2 QUERY L R 表示詢問從第 L個軍營到第R個軍營之間的總人數。

Output

 對於每組資料中的詢問,輸出詢問值。每組資料後面有一個空行。

Sample Input

4 7
78 16 94 36 
QUERY 1 2 
UPDATE 4 62 
QUERY 4 4 
QUERY 1 3 
QUERY 1 4 
QUERY 4 4 
UPDATE 2 35

Sample Output

94 
98 
188 
286 
98 

Hint

Source

有幾個函式在這裡解釋一下是什麼意思PushUp(由下往上更新修改後的資料),Build(初始化線段樹),Update(修改葉子結點的資料),Query(查詢區間資料)

#include <cstdio>  
#include <iostream>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
int a[6000000];  
void PushUp(int st)  
{  
    a[st]=a[st<<1]+a[st<<1|1];  
}  
void Build(int L,int R,int st)  
{  
    a[st]=0;  
    if(L==R)  
    {  
        scanf("%d",&a[st]);  
        return ;  
    }  
    int mid=(L+R)>>1;  
    Build(L,mid,st<<1);  
    Build(mid+1,R,st<<1|1);  
    PushUp(st);  
}  
void Updata(int L,int R,int st,int x,int d)  
{  
    if(L==R)  
    {  
        a[st]+=d;  
        return ;  
    }  
    int mid=(L+R)>>1;  
    if(x<=mid)  
        Updata(L,mid,st<<1,x,d);  
    else  
        Updata(mid+1,R,st<<1|1,x,d);  
    PushUp(st);  
}  
  
int Query(int L,int R,int st,int l,int r)  
{  
    if(R<l||L>r)  
        return 0;  
    if(L>=l&&R<=r)  
        return a[st];  
    int mid=(L+R)>>1;  
    int ans=0;  
    if(l<=mid)  
        ans+=Query(L,mid,st<<1,l,r);  
    if(r>mid)  
        ans+=Query(mid+1,R,st<<1|1,l,r);  
    return ans;  
}  
int main()  
{  
    int n,m;  
    char str[100];  
    int x,d,l,r;  
    while(~scanf("%d%d",&n,&m))  
    {  
        Build(1,n,1);  
        while(m--)  
        {  
            scanf("%s",str);  
            if(!strcmp(str,"UPDATE"))  
            {  
                scanf("%d%d",&x,&d);  
                Updata(1,n,1,x,d);  
            }  
            else  
            {  
                scanf("%d%d",&l,&r);  
                printf("%d\n",Query(1,n,1,l,r));  
            }  
        }  
        cout<<endl;  
    }  
    return 0;  
}