1. 程式人生 > >題目描述 Description 一行N個方格,開始每個格子裡都有一個整數。現在動態地提出一些問題和修改:提問的形式是求某一個特定的子區間[a,b]中所有元素的和;修改的規則是指定某一個格子x,加上或

題目描述 Description 一行N個方格,開始每個格子裡都有一個整數。現在動態地提出一些問題和修改:提問的形式是求某一個特定的子區間[a,b]中所有元素的和;修改的規則是指定某一個格子x,加上或

題目描述 Description
一行N個方格,開始每個格子裡都有一個整數。現在動態地提出一些問題和修改:提問的形式是求某一個特定的子區間[a,b]中所有元素的和;修改的規則是指定某一個格子x,加上或者減去一個特定的值A。現在要求你能對每個提問作出正確的回答。1≤N<100000,,提問和修改的總數m<10000條。
輸入描述 Input Description
輸入檔案第一行為一個整數N,接下來是n行n個整數,表示格子中原來的整數。接下一個正整數m,再接下來有m行,表示m個詢問,第一個整數表示詢問代號,詢問代號1表示增加,後面的兩個數x和A表示給位置X上的數值增加A,詢問代號2表示區間求和,後面兩個整數表示a和b,表示要求[a,b]之間的區間和。
輸出描述 Output Description
共m行,每個整數
樣例輸入 Sample Input
6
4
5
6
2
1
3
4
1 3 5
2 1 4
1 1 9
2 2 6
樣例輸出 Sample Output
22
22
資料範圍及提示 Data Size & Hint
1≤N<100000, m<10000 。

#include<iostream>
using namespace std;
int q[100005];
struct su{
	int l,r,w;
}a[100005];
void build(int l,int r,int k)//構造一棵二叉樹
{
	a[k].r=r;
	a[k].l=l;
	if(l==r)
	{
		a[k].w=q[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,k*2);;
	build(mid+1,r,k*2+1);
	a[k].w=a[k*2].w+a[k*2+1].w;
}
void ask(int k,int p,int w)//從根節開始點找到p,對路徑上所有節點進行+w操作
{
	if(p>=a[k].l&&p<=a[k].r)
	{
		a[k].w+=w;
	}
	if(a[k].l==a[k].r) return;
	int mid=(a[k].l+a[k].r)/2;
	if(p<=mid) ask(2*k,p,w);
	else ask(2*k+1,p,w);
}
int ad(int l,int r,int k)//從根節點開始,找到[l,r]區間
{
	if(a[k].l==l&&a[k].r==r)//區間完全在當前節點中
	{
		return a[k].w;
	}
	int mid=(a[k].l+a[k].r)/2;
	if(r<=mid)//區間在左節點
	{
		return 	ad(l,r,k*2);
	}
	else if(l>mid){//區間在右節點
	return 	ad(l,r,k*2+1);
	}
	else
	{
		return ad(l,mid,k*2)+ad(mid+1,r,k*2+1);//區間在左右節點中
	}
}
int main()
{
	int n;
	int m;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>q[i];
	build(1,n,1);
	cin>>m;
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y>>z;
		if(x==1)
		ask(1,y,z);
		if(x==2)
		cout<<ad(y,z,1)<<endl;
	}
	return 0;
}

相關推薦

題目描述 Description 一行N個方格,開始每個格子裡都有一個整數。現在動態地提出一些問題和修改:提問形式求某一個特定的子區間[a,b]中所有元素的修改的規則是指定某一個格子x加上或

題目描述 Description 一行N個方格,開始每個格子裡都有一個整數。現在動態地提出一些問題和修改:提問的形式是求某一個特定的子區間[a,b]中所有元素的和;修改的規則是指定某一個格子x,加上或者減去一個特定的值A。現在要求你能對每個提問作出正確的回答。1

ACMNO.39 分解質因數 區間[a,b]所有整數的質因數分解藍橋杯訓練!

題目描述 求出區間[a,b]中所有整數的質因數分解。 輸入 輸入兩個整數a,b。 輸出 每行輸出一個數的分解,形如k=a1*a2*a3...(a1< =a2< =a3...,k也是從小到大的)(具體可看樣例) 樣例輸入 3 10 樣

【JAVA】區間[a,b]所有整數的質因數分解

問題描述  求出區間[a,b]中所有整數的質因數分解。輸入格式  輸入兩個整數a,b。輸出格式  每行輸出一個數的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是從小到大的)(具體可看樣例)樣例輸入3 10樣例輸出3=34=2*25=56=

[微軟]序列a,b大小n,序列元素的值任意整數無序 要求通過交換a,b元素使[序列a元素]與[序列b元素]之間的差最小_利用排列組合思路解決_python版

+= 求和 ever tro 解決 turn 運行 main lis (原題出自微軟公司面試題)問題如下:有兩個序列a,b,大小都為n,序列元素的值任意整數,無序;要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。例如:a=[100,99,

華為面試題(8分鐘寫出程式碼) 陣列a,b大小n,陣列元素的值任意無序 要求通過交換a,b元素使陣列a元素與陣列b元素之間的差最小

先上程式碼 java程式碼: public class MinDiff { public static void main(String[] args){ int[] aa={2,5,4,3,1,0}; int[] bb={7,9,8,10,6,11}

序列a,b大小n,序列元素的值任意整數無序要求通過交換a,b元素使[序列a元素

原題:有一序列a,大小為n,分為2部分,序列元素的值任意整形數,無序; 要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小,用python寫。 #coding=ut

序列a,b大小n,序列元素的值任意整形數無序 要求通過交換a,b元素使[序列a元素]與[序列b元素]之間的差最小

整體思想是利用兩個列表和的差值絕對值大小判斷是否互動兩個列表的值#!/usr/bin/env python# coding=utf-8def abs_test(a,b):    # 假設剛開始就是差值最小的    # 此時的差值絕對值為:    min = abs(sum(a

Python 經典面試題: a,b序列,大小n,序列元素的值任意整形數,無序, 要求: 通過交換a,b元素,使[序列a元素]與[序列b元素]之間的差最小 使

方法: 用隨機數來求出結果 解題思想: 用隨機數隨機出來所有的程式碼排列可能性,在定義次數的時候 定義的次數越大得到的結果越準確. 最終程式碼: import random #有很多方法是把兩個列表合成一個後排序按照一大一小的分配生成兩個列表 #但是這樣是在資

python面試題通過交換a,b元素使[序列a]與[序列b]之間的差最小

    sumb = sum(lstb)     d = abs(suma-sumb)     if d == 0:         return d          bExchange = False         for indexa, ia in enumerate(lsta):         i

找出區間[A, B]內所有數字的奇數字位出現次數為偶數偶數字位出現次數為計數的數的個數(數位DP)

題目:找出區間[A, B]內所有數字的奇數字位出現次數為偶數,偶數字位出現次數為計數的數的個數。   分析:這道題的狀態同樣不好取,因為要求每一個奇數的個數都要為偶數,每一個偶數的位數都要為奇數,又因為只有10個數(0~9),又因為沒個數只有3種狀態,分別是沒有(0),奇數個(1),偶數個(2)

lintcode55:比較兩字串AB確定A是否包含B所有的字元

*樣例 給出 A = “ABCD” B = “ACD”,返回 true 給出 A = “ABCD” B = “AABC”, 返回 false 注意 在 A 中出現的 B 字串裡的字元不需要連續或

比較兩字串AB確定A是否包含B所有的字元

如題 樣例 給出 A = "ABCD" B = "ACD",返回 true 給出 A = "ABCD" B = "AABC", 返回 false 注意 在 A 中出現的 B 字串裡的字元不需要連續或者有序。 目前思路是分別掃描兩個字串得到兩個map&l

C++ 在容器A查找容器B元素並返回iterator(find_end)

++ com == end efault red != color position #include <iostream> // cout #include <algorithm> // find_end #include &l

C++ 在容器A查詢最後出現的容器B元素並返回iterator(find_end)

  #include <iostream> // cout #include <algorithm> // find_end #include <vector> // vector using namespace std; bo

給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]不能使用除法

題目描述 給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 /* 思路:題目要求B的i個元素等於A中除了i個元素所以元素乘積 因此思路很清

【類物件】1+2+3+...+n要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)

題目描述: 求1+2+3+...+n,要求不能使用乘除法(數學公式)、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C). 分析:這道題雖然常用的方式都給禁掉了,但是可以使用我們c++學過的類和物件,通過使用類和靜態來完成。常規情況下,從1+到n,

集合差集操作a - b 的含義為在集合a但不在b元素集合

a = set(‘boy’) a Out[8]: {‘b’, ‘o’, ‘y’} b = set(‘girlb’) b Out[10]: {‘b’, ‘g’, ‘i’, ‘l’, ‘r’} c = a - b c Out[12]: {‘o’, ‘y’} 集合(set)是一

題目描述 1+2+3+...+n要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)

//求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字 //及條件判斷語句(A?B:C)。 public class Solution { public int Sum_Solution(int n) { //if

【BZOJ 1833】【數位DP】 ZJOI2010 count【在[a,b]所有整數每個數碼(digit)各出現了多少次】

描述: 1833: [ZJOI2010]count 數字計數 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2766  Solved: 1226 [

46、1+2+3+...+n要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)

closed else while spl 判斷語句 stat 條件 執行 ret 思路:循環或者遞歸都有個結束條件和執行條件。用&&短路與代替。 //短路與&&;就是只有前一個條件滿足才可以去判斷第二個條件。 //遞歸的出口